Administrator
发布于 2026-08-14 / 27 阅读
1
0

视频YUV 原始数据经过 H.264/H.265 编码后的格式

如上图所示,YUV 原始数据经过 H.264/H.265 编码后,经过两个阶段的格式变化:

1. 编码器直接输出:H.264/H.265 压缩码流 (Elementary Stream)

这是编码器的直接产物,不是文件格式,而是一串二进制压缩数据。由 NAL (Network Abstraction Layer) 单元组成:

NAL 单元类型

作用

SPS

序列参数集 — 分辨率、profile、帧率等

PPS

图像参数集 — 编码参数

IDR / I 帧

关键帧 — 帧内预测,可独立解码

P 帧

前向预测帧 — 参考前面的帧

B 帧

双向预测帧 — 参考前后帧

码流有两种封装格式:

  • Annex B — 每个 NAL 前加 start code 00 00 00 01,用于 TS 流、裸 .h264/.265 文件

  • AVCC / HVCC — 每个 NAL 前加 4 字节长度前缀,SPS/PPS 单独存储,用于 MP4 容器

2. 封装为容器格式(文件格式)

码流本身不能直接作为视频文件播放,需要与音频、字幕、元数据 mux (复用) 到容器中:

容器

扩展名

内部码流格式

MP4 / MOV

.mp4 .mov

AVCC / HVCC

Matroska

.mkv

AVCC / HVCC

MPEG-TS

.ts

Annex B

FLV

.flv

Annex B

完整管线

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。


评论