📄 一句话概括
扩展名只说【这是什么盒子】——同样叫 .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 秒实验
- 找两个都叫 .mp4 的文件,用 MediaInfo 各读一次。
- 对比它们的视频编码是否相同。
常见误区
- 以为 .mp4 就是 H.264。同后缀下编码可以完全不同。
- 靠改后缀来【转格式】。那只是改了名字,内容没动。
自测三问(点开对答案)
1. 【视频格式】这个词包含哪两层意思? —— 容器格式(文件结构)与编码格式(数据压法)。 2. 为什么不能靠后缀名判断规格? —— 后缀随时可改,且换编码时常不换扩展名。 3. 判断一个视频的真实规格,正确做法是什么? —— 用 MediaInfo 或 ffprobe 读容器与各路流的编码。- ☐ 下一节(5.2.1 数据封装和解封装)
相关笔记
- 封装格式 — 盒子的几种流派
- 视频压缩 — 编码格式讲的是压法
- MediaInfo — 读规格的那把尺子
- 🎬 FFmpeg入门详解 · 索引