🎬 第五章 视频基础
📄 一句话概括

扩展名只说【这是什么盒子】——同样叫 .mp4 的文件,里面可能是 H.264,也可能是 H.265;判断规格永远靠工具,不靠后缀名。

📝 本节和前面几节的关系

5.1.4 讲了描述视频的参数,这一节讲一个最常见的混淆:格式到底指什么。

一、【格式】这个词有两个意思

日常说【视频格式】,其实混了两件事: 容器格式:文件的结构——MP4、MKV、AVI、FLV、TS。 编码格式:里面数据的压法——H.264、H.265、MPEG-4、VP9。 这两件事互相独立,一个容器可以装很多种编码。

二、常见的组合

.mp4:最常见的 H.264 + AAC,通用性最好。 .mkv:结构灵活,能装多条音轨与字幕,本地收藏常用。 .avi:老格式,至今还有老素材与老软件在用。 .flv:结构简单、延迟低,直播推流的老牌选择。 .ts:定长包、无全局索引,适合边来边播。

三、为什么后缀名靠不住

因为后缀名只是文件名的一部分,随时可以改。 把 MKV 改名叫 MP4,后缀变了,里面的结构一点没变。 反过来,很多转码工具会把编码换掉,却仍用同一个扩展名。 所以【看后缀判断规格】必然出错——这种事只能交给工具。

四、正确的判断流程

第一步用 MediaInfo(或 ffprobe)读容器与编码。 第二步再决定要不要转——换盒子很快,换编码很慢。 这两句话在第 3.2.1 节与第 3.5.2 节都出现过:任何陌生文件,先过一遍 MediaInfo 再动手;第一条判断永远是——这次要换的是【盒子】还是【内容】?

五、动手 Demo:扩展名、容器、编码,三者不是一回事

同样叫 MP4 的文件,里面的视频编码可能完全不同。

rows = [(".mp4", "H.264 / H.265", "AAC"), (".mkv", "H.264 / H.265 / VP9", "AAC / Opus / FLAC"),
        (".avi", "MPEG-4 / H.264", "MP3 / AC-3"), (".flv", "H.264", "AAC / MP3"),
        (".ts", "H.264 / H.265", "AAC / AC-3")]
for a, b, c in rows:
    print("%-6s %-22s %s" % (a, b, c))

实跑输出:

--------------------------------------------------------------------
扩展名、容器、编码,三者不是一回事
--------------------------------------------------------------------

同样叫 MP4 的文件,里面的视频编码可能完全不同。

  扩展名     常见视频编码            常见音频编码
  -----------------------------------------------------
  .mp4       H.264 / H.265           AAC
  .mkv       H.264 / H.265 / VP9     AAC / Opus / FLAC
  .avi       MPEG-4 / H.264          MP3 / AC-3
  .flv       H.264                   AAC / MP3
  .ts        H.264 / H.265           AAC / AC-3

  扩展名只说【这是什么盒子】,**里面的编码要单独看**。
  所以判断文件规格永远靠工具(如 MediaInfo),**不能靠后缀名**。

扩展名只说【这是什么盒子】,里面的编码要单独看。 所以判断文件规格永远靠工具(如 MediaInfo),不能靠后缀名。

30 秒实验

  1. 找两个都叫 .mp4 的文件,用 MediaInfo 各读一次。
  2. 对比它们的视频编码是否相同。

常见误区

  1. 以为 .mp4 就是 H.264。同后缀下编码可以完全不同。
  2. 靠改后缀来【转格式】。那只是改了名字,内容没动。
自测三问(点开对答案) 1. 【视频格式】这个词包含哪两层意思? —— 容器格式(文件结构)与编码格式(数据压法)。 2. 为什么不能靠后缀名判断规格? —— 后缀随时可改,且换编码时常不换扩展名。 3. 判断一个视频的真实规格,正确做法是什么? —— 用 MediaInfo 或 ffprobe 读容器与各路流的编码。

相关笔记