视频文件结构与编码学习笔记

视频文件结构与编码学习笔记

> 本笔记基于 ChatGPT 分享对话《视频文件结构与编码》的内容整理,并补充了视频容器、编码、播放链路、色彩、码率控制和常见排查思路。

1. 先建立整体认识

一个常见的视频文件并不是“只有画面”的文件,而是一个被封装起来的多媒体包。它通常包含:

  • 视频流:压缩后的连续画面数据。
  • 音频流:压缩后的声音数据。
  • 字幕流:文字字幕或图像字幕。
  • 元数据:标题、作者、创建时间、旋转角度、编码器信息、章节信息等。
  • 索引和时间戳:帮助播放器定位、拖动进度、保持音画同步。

可以把视频文件理解成:

1
视频文件 = 容器格式 + 一个或多个编码后的媒体流 + 元数据 + 索引/时间信息

例如一个 movie.mp4 可能是:

1
2
3
4
5
容器:MP4
视频编码:H.264
音频编码:AAC
字幕:mov_text 或外挂 .srt
元数据:时长、分辨率、旋转信息、编码器信息

所以 .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
1920 x 1080 x 3 字节 x 30 帧 ≈ 178 MB/s

一分钟就可能超过 10GB。因此日常视频几乎都需要压缩编码。

3.1 H.264 / AVC

H.264 是目前兼容性最强的视频编码之一。

特点:

  • 兼容性极高。
  • 硬件解码支持普遍。
  • 编码速度、压缩率、画质之间平衡很好。
  • 适合直播、录屏、上传、移动端播放。

如果不知道怎么选,通常可以优先选择:

1
MP4 + H.264 + AAC

这是最稳的通用组合。

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
I B B P B B P B B P ...

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
文件大小 ≈ 平均总码率 x 时长

例如一个 10 分钟、平均总码率 8 Mbps 的视频:

1
8 Mbps x 600 秒 / 8 ≈ 600 MB

这里除以 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
2
3
4
5
6
7
8
9
10
11
[ftyp]
[moov]
[mvhd]
[trak]
[tkhd]
[mdia]
[mdhd]
[hdlr]
[minf]
[stbl]
[mdat]

其中:

  • moov 像目录和说明书。
  • mdat 像真正的音视频数据仓库。
  • stbl 里保存 sample table,用于记录样本位置、时长、关键帧等。

11.1 为什么有些 MP4 要“fast start”

如果 moov 在文件末尾,播放器可能要先下载完整文件或跳到末尾读取元数据,网页播放启动会变慢。

所谓 fast start 通常是把 moov 移到文件开头,让播放器更快获得索引和时长信息。

用 FFmpeg 常见命令:

1
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4

这里 -c copy 表示不重新编码,只重新封装。

12. 播放一个视频时发生了什么

播放链路大致如下:

1
2
3
4
5
6
7
8
读取文件
-> 解析容器
-> 解复用 demux
-> 得到视频流、音频流、字幕流
-> 解码 decode
-> 视频帧送到渲染器
-> 音频帧送到音频设备
-> 根据时间戳做同步

关键步骤:

  • 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
MKV(H.264 + AAC) -> MP4(H.264 + AAC)

FFmpeg 示例:

1
ffmpeg -i input.mkv -c copy output.mp4

优点:

  • 速度快。
  • 几乎不损失画质。

前提:

  • 目标容器支持原来的编码格式。

15.2 转码

转码会重新编码视频或音频。

例如:

1
2
H.265 -> H.264
FLAC -> AAC

FFmpeg 示例:

1
ffmpeg -i input.mkv -c:v libx264 -crf 20 -c:a aac -b:a 192k output.mp4

特点:

  • 耗时更长。
  • 有损转有损通常会产生二次损失。
  • 可以提升兼容性或减小体积。

15.3 不要把改后缀当成转换

video.mkv 直接重命名成 video.mp4 不会改变内部结构,也不会提升兼容性。真正转换需要重新封装或转码。

16. 常见场景选择建议

16.1 日常分享和最大兼容

推荐:

1
MP4 + H.264 + AAC

理由:

  • 手机、电脑、浏览器、电视兼容性都很好。
  • 上传平台也普遍接受。

16.2 本地高清收藏

推荐:

1
MKV + H.265/H.264 + AAC/AC-3/DTS + 多字幕

理由:

  • 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
ffprobe input.mp4

查看流信息:

1
ffprobe -hide_banner -show_streams input.mp4

查看容器格式信息:

1
ffprobe -hide_banner -show_format input.mp4

常关注字段:

  • 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
ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4

18.2 有画面没声音

可能原因:

  • 播放器不支持音频编码。
  • 音轨被静音或选错。
  • 音频流损坏。

排查:

1
ffprobe -hide_banner -show_streams input.mp4

看是否存在 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
2
3
MP4、MKV、MOV、AVI、WebM 是容器。
H.264、H.265、AV1、VP9 是视频编码。
AAC、Opus、MP3、FLAC 是音频编码。

19.2 分辨率不等于画质

画质受分辨率、码率、编码效率、源素材质量、色彩、帧率、编码器参数共同影响。

19.3 兼容性优先的默认选择

1
MP4 + H.264 + AAC + yuv420p

19.4 收藏和多轨优先的默认选择

1
MKV + 高效视频编码 + 多音轨 + 多字幕

19.5 交付格式不一定适合剪辑

H.264/H.265 很适合发布,但不一定适合后期剪辑。剪辑中间格式通常体积更大,但编辑体验更好。

20. 一句话总结

视频文件的核心不是“一个后缀名”,而是容器、编码、码率、时间戳、色彩信息和播放设备共同作用的结果。学习视频文件时,先分清“容器负责装什么”“编码负责怎么压缩”“播放器负责怎么拆、解码和同步”,很多问题就能定位到正确层面。

评论区


视频文件结构与编码学习笔记
https://aoiblog.top/2026/04/30/shi-pin-wen-jian-jie-gou-yu-bian-ma-xue-xi-bi-ji/
作者
Aoitsuki
发布于
2026年5月1日
许可协议