Skip to main content

H.264/AVC

MPEG-4 Part 10 标准文档定义了 Advanced Video Coding (AVC),高级视频编码,数字视像压缩标准。

H.264 主要从以下几个方面提高编码效率:

1. 预测与运动补偿 (Prediction & Compensation)

  • 灵活帧间预测: 突破传统 16×16 限制,最小可细分至 4×4 像素块,大幅提升运动预测精度。
  • 多模式帧内预测: 提供 16×16 和 4×4 多种空间方向预测模式,精准消除空间冗余。
  • 多参考帧搜索: 允许在多个已解码帧中进行运动匹配,有效应对遮挡和复杂运动。

2. 变换与量化 (Transform & Quantization)

  • 4×4 整数变换: 取代传统浮点 DCT,不仅提升了软硬件运算速度,还彻底消除了编解码反变换时的误差漂移现象。

3. 环路滤波 (In-Loop Filtering)

  • 自适应去块滤波器: 内嵌于预测环路中,智能平滑宏块边界,消除“马赛克”失真,同时提升后续参考帧的画质。

4. 熵编码 (Entropy Coding)

  • CAVLC 与 CABAC: 摒弃传统静态编码,采用基于上下文的自适应编码技术,根据数据特征实时调整模型,实现极限压缩率。
ffplay ./foreman_cif.y4m

Input #0, yuv4mpegpipe, from './foreman_cif.y4m':
Duration: 00:00:10.01, start: 0.000000, bitrate: 36460 kb/s
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 352x288, SAR 128:117 DAR 1408:1053, 29.97 fps, 29.97 tbr, 29.97 tbn
20.26 M-V: 0.000 fd= 0 aq= 0KB vq= 0KB sq= 0B

这是一段典型的由 **FFmpeg**(或基于其内核的视频处理工具)读取视频文件时输出的媒体信息日志。它详细描述了你提供的这个 `.y4m` 文件的各项内部技术参数。

结合你上一个关于 Y4M 格式的问题,我们可以逐行把这段“天书”拆解开,看看它具体代表什么意思:

### 1. 文件读取信息
> `Input #0, yuv4mpegpipe, from './foreman_cif.y4m':`

* **Input #0**:表示这是程序加载的第一个输入文件。
* **yuv4mpegpipe**:工具识别出的格式类型,确认这是一个无压缩的 YUV4MPEG2 管道数据流。
* **'./foreman_cif.y4m'**:文件名。顺便一提,**“foreman”**(工头)是视频压缩和编码研究领域非常著名的一个标准化测试视频序列,而 **“cif”** 则是它的分辨率规格。

### 2. 时长与码率(体积特征)
> `Duration: 00:00:10.01, start: 0.000000, bitrate: 36460 kb/s`

* **Duration: 00:00:10.01**:视频总时长为 10.01 秒。
* **start: 0.000000**:时间戳从 0 秒开始计算。
* **bitrate: 36460 kb/s**:平均码率约为 **36.46 Mbps**。对于一个分辨率如此之低(仅 352x288)的视频来说,这个码率大得惊人(如果是 H.264 编码,通常只需要几百 kb/s)。这直接印证了它**完全没有经过压缩**。

### 3. 画面核心参数(重头戏)
> `Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 352x288, SAR 128:117 DAR 1408:1053, 29.97 fps, 29.97 tbr, 29.97 tbn`

* **Stream #0:0**:文件中的第一条数据流(通常 0:0 是视频流,Y4M 文件一般不含音频)。
* **Video: rawvideo (I420...)**:视频编码格式为**原始视频数据**。`I420` 是一种具体的内存数据排列标识(FourCC代码)。
* **yuv420p(progressive)**:
* **yuv420p**:色彩采样格式为 YUV 4:2:0 平面模式(Planar),这是目前视频处理和日常视频格式中最通用的标准。
* **progressive**:代表它是**逐行扫描**(Progressive scan),每一帧都是一幅完整的静止画面(而不是老式电视的隔行扫描)。
* **352x288**:视频的物理像素分辨率(宽 352 像素,高 288 像素)。这个尺寸在早期视频标准中被称为 **CIF**(Common Intermediate Format)。
* **SAR 128:117**:采样长宽比(Sample Aspect Ratio)。意思是这个视频里的每一个物理像素点**并不是正方形的**,它的宽和高的比例是 128:117。
* **DAR 1408:1053**:显示长宽比(Display Aspect Ratio)。当播放器播放这个视频时,会把物理像素拉伸,展现给观众的最终画面宽高比约为 **1.33:1**,非常接近传统的 4:3 屏幕比例。
* **29.97 fps, 29.97 tbr, 29.97 tbn**:
* **fps**:我们常说的**帧率**(Frames Per Second),即每秒播放 29.97 帧画面,这是标准的 NTSC 电视制式帧率。
* **tbr / tbn**:FFmpeg 内部用于时间戳计算的“时基”参数,这里与帧率保持一致,说明视频的时间戳记录非常规范。

**总结:** 这段日志告诉你,你拿到了一个 10秒钟的、采用 NTSC 标准帧率、CIF 分辨率、采用 YUV 4:2:0 色彩采样的**纯无损原始视频文件**。这就是一个供编码器测试或作为中间介质使用的标准素材。






这个 **36460 kb/s** 的码率,完全是通过物理参数一步步进行纯数学乘法计算得出的。因为它是无压缩的,所以计算过程非常精确。

这里有三个核心要素:**画面分辨率**、**色彩采样格式(YUV 4:2:0)** 以及 **帧率**。

以下是具体的推导过程:

### 第一步:计算单帧画面的像素总数
视频的分辨率是 352x288。
* 单帧像素量 = $352 \times 288 = 101,376$ 个像素

### 第二步:计算每个像素占用的数据大小
视频使用的色彩采样格式是 **yuv420p**。在标准的 8 位色深下,它的数据占用是这样分配的:
* **Y(亮度/黑白画面)**:每个像素都需要记录,占用 1 个字节(8 bits)。
* **U 和 V(色彩信息)**:由于 4:2:0 采样的特性,每 4 个像素共享 1组 U 和 V 数据。因此 U 和 V 平均分摊到每个像素上,各占 0.25 个字节(2 bits)。
* **平均每像素占用** = $1 + 0.25 + 0.25 = 1.5$ 字节(即 **12 bits**)。

### 第三步:计算单帧画面的总数据量
将像素总数乘以每像素占用的数据大小:
* 单帧纯画面比特数 = $101,376 \times 12 = 1,216,512$ bits

**注意:** Y4M 文件有一个非常微小的“额外开销”。它在每一帧数据的开头,都会写上 `FRAME` 这 5 个英文字母和一个换行符(共计 6 个字节)。
* 单帧文件头比特数 = $6 \times 8 = 48$ bits
* 真实的单帧总比特数 = $1,216,512 + 48 = 1,216,560$ bits

### 第四步:计算每秒的总码率(Bitrate)
一秒钟有 29.97 帧,直接相乘:
* 每秒总比特数 (bps) = $1,216,560 \times 29.97 = 36,460,303.2$ bps

### 第五步:换算为 kb/s
在媒体和网络传输领域,千比特(kb)通常按 1000 换算,而不是 1024:
* 最终码率 = $36,460,303.2 \div 1000 \approx 36,460.3$ kb/s

FFmpeg 将这个数字四舍五入到整数,这就得出了日志中显示的 **36460 kb/s**。