
如上图所示,YUV 原始数据经过 H.264/H.265 编码后,经过两个阶段的格式变化:
1. 编码器直接输出:H.264/H.265 压缩码流 (Elementary Stream)
这是编码器的直接产物,不是文件格式,而是一串二进制压缩数据。由 NAL (Network Abstraction Layer) 单元组成:
码流有两种封装格式:
Annex B — 每个 NAL 前加 start code
00 00 00 01,用于 TS 流、裸 .h264/.265 文件AVCC / HVCC — 每个 NAL 前加 4 字节长度前缀,SPS/PPS 单独存储,用于 MP4 容器
2. 封装为容器格式(文件格式)
码流本身不能直接作为视频文件播放,需要与音频、字幕、元数据 mux (复用) 到容器中:
完整管线
YUV (YUV420, 未压缩)
→ H.264/H.265 编码器 (帧内预测 + 帧间预测 + DCT + 熵编码)
→ 压缩码流 ES (NAL units, 压缩比通常 50~200:1)
→ MediaMuxer 复用 (混入音频/元数据)
→ .mp4 / .mkv / .ts 文件
核心区分:H.264/H.265 是编解码器 (codec),负责压缩;MP4/MKV 是容器 (container),负责封装。我们日常说的"MP4 视频"通常是 H.264 编码 + MP4 容器的组合。
在 Android 开发中,这条管线对应 ImageReader (YUV_420_888) → MediaCodec (encoder) → MediaMuxer (.mp4) 三个 API。