视频文件结构与编码学习笔记
视频文件结构与编码学习笔记
> 本笔记基于 ChatGPT 分享对话《视频文件结构与编码》的内容整理,并补充了视频容器、编码、播放链路、色彩、码率控制和常见排查思路。1. 先建立整体认识
一个常见的视频文件并不是“只有画面”的文件,而是一个被封装起来的多媒体包。它通常包含:
- 视频流:压缩后的连续画面数据。
- 音频流:压缩后的声音数据。
- 字幕流:文字字幕或图像字幕。
- 元数据:标题、作者、创建时间、旋转角度、编码器信息、章节信息等。
- 索引和时间戳:帮助播放器定位、拖动进度、保持音画同步。
可以把视频文件理解成:
1 | |
例如一个 movie.mp4 可能是:
1 | |
所以 .mp4、.mkv、.avi 这类后缀通常说明的是“容器格式”,不等于视频编码格式。
2. 容器格式:视频文件的包装盒
容器负责把视频、音频、字幕、元数据等组织在一起。它解决的是“怎么装”的问题,而不是“怎么压缩”的问题。
2.1 MP4
MP4 是最常见的容器之一,兼容性非常好。
常见搭配:
- 视频:H.264、H.265、AV1
- 音频:AAC、ALAC、MP3
- 字幕:mov_text、外挂 SRT
适合场景:
- 手机播放
- 网页播放
- 上传视频平台
- 日常分享
优点是兼容性好,缺点是对复杂字幕、多音轨、多附件的灵活性不如 MKV。
2.2 MKV
MKV 是 Matroska 容器,功能很强,常见于高清电影、番剧、收藏资源。
特点:
- 支持多视频流、多音频流、多字幕流。
- 支持章节、附件、字体文件。
- 对 ASS/SSA 等复杂字幕支持较好。
- 可以封装很多种编码格式。
适合场景:
- 本地收藏
- 多语言音轨
- 多字幕版本
- 高规格影视资源
2.3 MOV
MOV 是 Apple QuickTime 体系下常见的容器,和 MP4 关系很近。
常见场景:
- iPhone、相机素材
- 剪辑软件工作流
- ProRes 等中间格式素材
2.4 AVI
AVI 是较老的容器格式。它历史悠久,但对现代编码、字幕、可变帧率、多轨道等支持不如新容器。
现在如果没有特殊兼容需求,一般不优先选择 AVI。
2.5 WebM
WebM 面向网页和开放生态,常见搭配是 VP8、VP9、AV1 视频编码,以及 Opus、Vorbis 音频编码。
适合场景:
- 浏览器播放
- 开放 Web 视频
- 动图替代类短视频
3. 编码格式:视频压缩的方法
编码格式解决的是“怎么压缩”的问题。
原始视频数据非常大。以 1920x1080、8bit、RGB、30fps 为例,未压缩数据量大致是:
1 | |
一分钟就可能超过 10GB。因此日常视频几乎都需要压缩编码。
3.1 H.264 / AVC
H.264 是目前兼容性最强的视频编码之一。
特点:
- 兼容性极高。
- 硬件解码支持普遍。
- 编码速度、压缩率、画质之间平衡很好。
- 适合直播、录屏、上传、移动端播放。
如果不知道怎么选,通常可以优先选择:
1 | |
这是最稳的通用组合。
3.2 H.265 / HEVC
H.265 比 H.264 有更高压缩效率,常见于 4K、HDR、手机高效视频格式。
特点:
- 同等画质下通常比 H.264 更省空间。
- 适合 4K、高码率、HDR。
- 编码和解码成本更高。
- 老设备、部分浏览器兼容性不如 H.264。
需要注意:HEVC 的生态中还可能涉及授权和平台支持问题。
3.3 AV1
AV1 是较新的开放视频编码,压缩效率优秀,越来越多流媒体平台开始使用。
特点:
- 压缩效率很高。
- 适合在线视频、流媒体分发。
- 开放免版税方向更友好。
- 软件编码通常较慢。
- 老设备硬解支持不足。
AV1 很适合平台级分发,但如果目标用户设备较旧,要谨慎选择。
3.4 VP9
VP9 由 Google 推广,在 YouTube 和 Web 视频中比较常见。
特点:
- 压缩效率优于 H.264。
- 浏览器支持较好。
- 常和 WebM 容器搭配。
- 设备兼容性总体不如 H.264。
3.5 ProRes / DNxHD / DNxHR
这些不是面向最终发布的小体积编码,而是常见的剪辑中间格式。
特点:
- 体积大。
- 解码压力相对低。
- 保留更多画面信息。
- 更适合剪辑、调色、后期制作。
如果素材要反复剪辑,不一定应该用 H.264/H.265 这种高压缩交付格式。
4. 音频编码
视频文件里通常也包含音频流。常见音频编码包括:
- AAC:MP4 中最常见,兼容性好,压缩效率不错。
- MP3:老牌有损音频格式,兼容性强。
- Opus:低码率表现优秀,常见于 WebRTC、网络语音、WebM。
- AC-3 / Dolby Digital:家庭影院、多声道常见。
- DTS:影视资源中常见的多声道音频格式。
- FLAC:无损音频,体积较大。
- ALAC:Apple 生态中的无损音频格式。
日常分享视频时,AAC 通常是最稳的音频选择。
5. 视频压缩到底压缩了什么
视频压缩主要利用两类冗余:
5.1 空间冗余
一张图像中,相邻像素通常很相似。例如蓝天、墙面、桌面等区域,很多像素颜色接近,不需要逐像素完整保存。
编码器会把画面分块,利用变换、量化、预测等方法减少数据量。
5.2 时间冗余
连续视频帧之间通常变化不大。例如一个人站着说话,背景基本不动,只有嘴和身体有局部变化。
编码器会利用帧间预测,只保存“变化”而不是每一帧完整画面。
6. I 帧、P 帧、B 帧与 GOP
视频编码不是每一帧都独立保存。常见帧类型包括:
- I 帧:关键帧,基本可以独立解码。
- P 帧:参考之前的帧,只保存预测差异。
- B 帧:可以参考前后帧,压缩效率更高,但解码和排序更复杂。
GOP 是 Group of Pictures,即一组图像。一个典型结构可能是:
1 | |
GOP 会影响:
- 文件体积
- 压缩效率
- 拖动响应
- 剪辑方便程度
- 直播延迟
一般来说:
- GOP 长:压缩效率高,体积更小,但拖动和剪辑不方便。
- GOP 短:更容易定位和编辑,但体积更大。
如果要做低延迟直播,通常不希望 GOP 太长,也会减少或禁用 B 帧。
7. 分辨率、帧率、码率
这三个概念经常被混在一起,但它们影响的是不同方面。
7.1 分辨率
分辨率表示画面有多少像素。
常见例子:
- 1280x720:720p
- 1920x1080:1080p
- 2560x1440:2K / QHD
- 3840x2160:4K UHD
分辨率影响画面细节上限,但不直接等于画质。低码率的 4K 可能比高质量 1080p 更糊。
7.2 帧率
帧率表示每秒显示多少帧。
常见例子:
- 24fps:电影常见。
- 25fps:PAL 电视制式相关地区常见。
- 30fps:普通网络视频常见。
- 50/60fps:运动、游戏、直播常见。
- 120fps 或更高:慢动作、高刷新素材。
帧率主要影响运动流畅度。帧率越高,通常需要更高码率来维持画质。
7.3 码率
码率表示单位时间使用多少数据,常见单位是 Mbps。
例如:
- 2 Mbps:普通 720p 或低码率 1080p。
- 8 Mbps:较常见的 1080p 网络视频。
- 25 Mbps:较高质量 4K 或高规格素材。
码率直接影响压缩强度和体积。同样编码下,码率越高,通常画质越好、文件越大。
大致关系:
1 | |
例如一个 10 分钟、平均总码率 8 Mbps 的视频:
1 | |
这里除以 8 是因为 8 bit = 1 byte。
8. CBR、VBR、CRF
码率控制方式会影响画质和体积。
8.1 CBR
CBR 是 Constant Bitrate,恒定码率。
特点:
- 码率稳定。
- 适合直播、带宽固定的传输场景。
- 复杂画面可能不够用,简单画面可能浪费码率。
8.2 VBR
VBR 是 Variable Bitrate,可变码率。
特点:
- 简单画面少分配码率,复杂画面多分配码率。
- 同等体积下通常比 CBR 更合理。
- 适合离线压制和点播。
8.3 CRF
CRF 是常见于 x264/x265 的恒定质量模式。
特点:
- 目标是保持主观质量相对稳定。
- 文件大小不固定。
- CRF 数值越低,质量越高,体积越大。
常见经验:
- x264 的 CRF 18 到 23 常用于较高质量压制。
- x265 的 CRF 数值不能和 x264 简单等价。
- 具体取值要结合内容、分辨率、编码器预设测试。
9. 像素格式、色彩采样与位深
9.1 RGB 与 YUV
显示设备常用 RGB 表示颜色,但视频编码中更常见的是 YUV 或 YCbCr。
其中:
- Y 表示亮度。
- U/V 或 Cb/Cr 表示色度。
人眼对亮度细节更敏感,对颜色细节相对不那么敏感,所以视频压缩常减少色度信息。
9.2 色彩采样
常见色彩采样格式:
- 4:4:4:亮度和色度信息都较完整,适合高质量制作。
- 4:2:2:专业视频、广播、采集卡素材中常见。
- 4:2:0:消费级视频、网络视频最常见。
大多数普通 MP4 视频都是 4:2:0。
9.3 位深
位深表示每个颜色通道能表示多少层级。
常见位深:
- 8bit:每通道 256 级,普通 SDR 视频常见。
- 10bit:每通道 1024 级,HDR 和高质量压制常见。
- 12bit:更专业的制作和母版场景。
位深越高,渐变越平滑,越不容易出现色带,但体积和解码要求也更高。
9.4 SDR 与 HDR
SDR 是普通动态范围,HDR 是高动态范围。
HDR 通常涉及:
- 更高亮度范围。
- 更广色域,如 BT.2020。
- 10bit 或更高位深。
- PQ 或 HLG 转换曲线。
- HDR10、HDR10+、Dolby Vision 等元数据体系。
如果 HDR 元数据、色域标记或播放设备支持有问题,可能出现画面发灰、过曝、颜色不对等现象。
10. 时间戳、索引与音画同步
播放器播放视频时,不只是顺序读文件,还需要理解时间信息。
重要概念:
- DTS:Decoding Time Stamp,解码时间戳。
- PTS:Presentation Time Stamp,显示时间戳。
- time base:时间单位基准。
- index:索引,帮助快速定位。
因为 B 帧可能参考未来帧,所以“解码顺序”和“显示顺序”可能不同。播放器需要根据 PTS/DTS 正确安排解码与显示。
如果时间戳或索引异常,可能出现:
- 音画不同步。
- 拖动进度条不准确。
- 某些播放器能播,某些播放器不能播。
- 视频开头黑屏或卡顿。
- 合并、剪辑后时长显示异常。
11. MP4 文件结构简要理解
MP4 内部由一系列 box,也叫 atom,组成。每个 box 通常有大小、类型和内容。
常见 box:
ftyp:文件类型和兼容品牌信息。moov:媒体元数据,包含轨道、时间、索引等关键信息。mdat:实际媒体数据。free:预留或填充空间。
一个普通 MP4 的抽象结构可能是:
1 | |
其中:
moov像目录和说明书。mdat像真正的音视频数据仓库。stbl里保存 sample table,用于记录样本位置、时长、关键帧等。
11.1 为什么有些 MP4 要“fast start”
如果 moov 在文件末尾,播放器可能要先下载完整文件或跳到末尾读取元数据,网页播放启动会变慢。
所谓 fast start 通常是把 moov 移到文件开头,让播放器更快获得索引和时长信息。
用 FFmpeg 常见命令:
1 | |
这里 -c copy 表示不重新编码,只重新封装。
12. 播放一个视频时发生了什么
播放链路大致如下:
1 | |
关键步骤:
- demux:从容器里拆出各条流。
- decode:把压缩数据还原成可显示/可播放的数据。
- render:把画面显示到屏幕,把声音送到扬声器。
- sync:根据时间戳维持音画同步。
13. 软解与硬解
13.1 软解
软解是用 CPU 解码。
优点:
- 灵活。
- 支持格式更多。
- 便于调试和兼容特殊编码。
缺点:
- 占用 CPU。
- 高分辨率、高码率、新编码可能卡顿。
13.2 硬解
硬解是用 GPU、SoC 或专门的视频解码模块。
优点:
- 省电。
- 性能好。
- 对移动设备很重要。
缺点:
- 取决于硬件是否支持对应编码、profile、level、位深、色彩采样。
例如某设备可能支持 H.264 8bit 4:2:0 硬解,但不支持 H.265 10bit 或 AV1 硬解。
14. 为什么同样 1080p,文件大小和画质差很多
影响因素很多,不只有分辨率:
- 编码格式不同:H.264、H.265、AV1 压缩效率不同。
- 码率不同:码率越低越容易糊、块状、涂抹。
- 帧率不同:60fps 通常比 30fps 需要更多码率。
- 画面复杂度不同:运动、噪点、草地、水面、烟雾都很吃码率。
- 编码器不同:x264、x265、SVT-AV1、硬件编码器效果不同。
- 编码预设不同:慢速预设通常压缩效率更好。
- 音频轨道不同:多音轨、无损音频会显著增大体积。
- 字幕和附件不同:字体附件、图像字幕也会增加体积。
所以两个 1080p 视频,一个 2GB,一个 12GB,都可能是合理的。
15. 常见封装、转码、转封装
15.1 转封装
转封装是只改变容器,不改变音视频编码。
例如:
1 | |
FFmpeg 示例:
1 | |
优点:
- 速度快。
- 几乎不损失画质。
前提:
- 目标容器支持原来的编码格式。
15.2 转码
转码会重新编码视频或音频。
例如:
1 | |
FFmpeg 示例:
1 | |
特点:
- 耗时更长。
- 有损转有损通常会产生二次损失。
- 可以提升兼容性或减小体积。
15.3 不要把改后缀当成转换
把 video.mkv 直接重命名成 video.mp4 不会改变内部结构,也不会提升兼容性。真正转换需要重新封装或转码。
16. 常见场景选择建议
16.1 日常分享和最大兼容
推荐:
1 | |
理由:
- 手机、电脑、浏览器、电视兼容性都很好。
- 上传平台也普遍接受。
16.2 本地高清收藏
推荐:
1 | |
理由:
- MKV 对多音轨、多字幕、章节、字体附件支持更灵活。
16.3 网页播放
常见选择:
- MP4 + H.264 + AAC:兼容性优先。
- WebM + VP9/AV1 + Opus:开放 Web 和节省带宽。
- HLS/DASH:长视频、直播、码率自适应。
16.4 剪辑和后期
推荐考虑:
- ProRes
- DNxHD / DNxHR
- 高码率 intra-frame 编码
理由:
- 更适合反复剪辑。
- 解码压力小。
- 时间线操作更流畅。
16.5 直播和低延迟
常见考虑:
- H.264 仍然非常常见。
- GOP 不宜过长。
- B 帧可能增加延迟。
- CBR 或受控 VBR 更方便带宽管理。
17. 用 FFmpeg / ffprobe 查看视频信息
查看基本信息:
1 | |
查看流信息:
1 | |
查看容器格式信息:
1 | |
常关注字段:
codec_name:编码格式。codec_type:流类型,如 video、audio、subtitle。width/height:分辨率。pix_fmt:像素格式,如 yuv420p、yuv420p10le。r_frame_rate:帧率相关信息。bit_rate:码率。duration:时长。profile/level:编码规格。
18. 常见问题排查
18.1 视频能播放但不能拖动
可能原因:
- 索引损坏或缺失。
moov在文件末尾,网络播放体验差。- 时间戳异常。
可尝试:
1 | |
18.2 有画面没声音
可能原因:
- 播放器不支持音频编码。
- 音轨被静音或选错。
- 音频流损坏。
排查:
1 | |
看是否存在 codec_type=audio。
18.3 有声音没画面
可能原因:
- 视频编码不被设备支持。
- 硬解失败。
- 视频流损坏。
- profile、level、位深或色彩采样超出设备能力。
解决方向:
- 换播放器。
- 关闭硬解尝试软解。
- 转码为 H.264 8bit 4:2:0。
18.4 音画不同步
可能原因:
- 时间戳异常。
- 可变帧率处理不当。
- 剪辑或合并时没有正确处理音频偏移。
- 播放器兼容问题。
解决方向:
- 重新封装。
- 转为恒定帧率。
- 使用音频延迟参数修正。
18.5 颜色发灰或过曝
可能原因:
- HDR 被当 SDR 播放。
- 色域标记错误。
- full range / limited range 处理不一致。
- 播放器或系统色彩管理问题。
需要检查:
- 色域:BT.709、BT.2020。
- 转换曲线:SDR gamma、PQ、HLG。
- 位深:8bit、10bit。
- range:limited / full。
19. 最重要的记忆卡片
19.1 容器和编码不要混淆
1 | |
19.2 分辨率不等于画质
画质受分辨率、码率、编码效率、源素材质量、色彩、帧率、编码器参数共同影响。
19.3 兼容性优先的默认选择
1 | |
19.4 收藏和多轨优先的默认选择
1 | |
19.5 交付格式不一定适合剪辑
H.264/H.265 很适合发布,但不一定适合后期剪辑。剪辑中间格式通常体积更大,但编辑体验更好。
20. 一句话总结
视频文件的核心不是“一个后缀名”,而是容器、编码、码率、时间戳、色彩信息和播放设备共同作用的结果。学习视频文件时,先分清“容器负责装什么”“编码负责怎么压缩”“播放器负责怎么拆、解码和同步”,很多问题就能定位到正确层面。
评论区