02-数字视频基础

2 阅读1分钟

数字视频是以离散时间采集的一系列二维图像,并为每张图像保存颜色样本和呈现时间信息的媒体信号。

1. 数字视频的四个采样维度

一段视频不是只有“许多图片”。每一帧都必须同时说明空间位置、颜色数值和显示时间;整段视频还要说明帧与帧之间的时间关系。

空间采样、时间采样和颜色表示共同定义“记录了什么”,而 PTS、duration 与时间基定义“何时呈现”。它们是数字视频帧并列的描述维度,不是依次执行的处理步骤。编码器会进一步压缩这些样本,但不会改变这些基础概念的含义。

2. 一帧图像由什么决定

一张数字视频帧至少可从四个维度描述:

维度

回答的问题

常见表示

空间采样

一帧有多少位置可记录图像

宽 × 高,例如 1920 × 1080

时间采样

每秒记录或呈现多少帧

24、25、30、29.97、60 fps

颜色表示

每个像素怎样表示亮度和颜色

RGB、YUV/YCbCr、位深、采样格式

时间关系

这一帧何时显示、持续多久

PTS、duration、time base

分辨率只描述空间采样数量;它不能单独决定清晰度、文件大小或显示比例。帧率只描述时间采样密度;它不能保证每两帧的时间间隔相同。

3. 帧率、时长与帧数

对于恒定帧率(CFR)素材,近似关系为 帧数 = 时长(秒)× 帧率(fps)

例如 10 秒、25 fps 的视频通常有 250 帧。29.97 fps 常写作 30000/1001,而不是精确的 30;计算时应使用有理数或时间戳,不要把显示文本强制转成整数。

可变帧率(VFR)视频的每帧 PTS 间隔不固定。录屏、手机拍摄、屏幕共享和某些直播录制常会出现 VFR。此时 总帧数 ÷ 平均帧率 只是估算,精确剪切和逐帧定位应以真实 PTS 为依据。

可通过下列命令快速查看流的标称帧率、平均帧率和时间基:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=codec_name,width,height,r_frame_rate,avg_frame_rate,time_base,duration \
  -of default=noprint_wrappers=1 input.mp4
  • r_frame_rate 是从流时间戳推导出的基础帧率提示,并不保证等于实际显示节奏。

  • avg_frame_rate 是时长范围内的平均值;VFR 下尤其不能把它当作每帧间隔。

  • time_base 将整数 PTS 换算为秒,例如 PTS 为 90000、时间基为 1/90000 时表示 1 秒。

4. 显示宽高比与像素宽高比

编码宽高是像素矩阵的尺寸,但显示形状还受样本宽高比(SAR)影响:DAR = (编码宽 ÷ 编码高)× SAR

  • SAR:一个编码像素在显示时的宽高比例,也称像素宽高比。

  • DAR:完整画面的显示宽高比例,例如 16:9。

现代网络视频通常使用方形像素(SAR 1:1),但广播、DVD 或历史素材可能不是。仅凭 width × height 计算画面形状,会在非方形像素素材上得出错误结论。

5. 隔行与逐行

逐行(progressive)帧一次记录完整画面;隔行(interlaced)画面由两个时间不同的场组成。隔行素材在静止显示、缩放或压缩时容易出现梳齿,因此通常先去隔行再处理。

ffmpeg -i interlaced-input.mov \
  -vf yadif \
  -c:v libx264 -crf 18 -c:a copy progressive-output.mp4

yadif 是 FFmpeg 的去隔行滤镜。该命令会解码视频、生成逐行帧并重新编码,所以不能保留原始视频码流;音频通过 -c:a copy 直接复制。是否需要去隔行应由源的 field order、画面内容和目标播放环境判断,不能对所有素材默认开启。

6. 旋转与显示方向

拍摄设备常把传感器输出按固定方向编码,再在元数据中写入旋转信息。此时“编码尺寸”和“视觉上的宽高”可能交换。对像素级操作(裁剪、缩放、叠加)要先确定策略:

  1. 让解码器自动按旋转显示,再基于视觉坐标处理;或

  2. 明确旋转像素并更新输出尺寸,避免依赖播放器是否识别旋转元数据。

两种策略都能成立,但同一次处理的预览坐标、滤镜顺序和输出元数据必须使用同一种坐标模型。

7. 原始视频为什么巨大

未压缩视频以像素样本直接保存,数据量近似为 字节数/秒 = 宽 × 高 × 每像素字节数 × fps

对于 1920×1080、8 位 4:2:0 的 yuv420p,每像素平均 1.5 字节;30 fps 原始数据约为 1920 × 1080 × 1.5 × 30 ≈ 93.3 MB/s

这解释了为何实际交付通常使用 H.264、HEVC、AV1 等压缩编码。压缩并不是删除“文件外壳”,而是利用空间、时间和视觉冗余减少每帧需要保存的信息。

8. 常见误区

8.1 60 fps 一定比 30 fps 更清晰

60 fps 改善的是运动时间分辨率和流畅度;静态细节主要由空间分辨率、镜头、编码质量和显示设备决定。相同码率下提高帧率还会减少每帧可用的数据预算。

8.2 1080p 永远等于 1920×1080

“1080p”通常指 1080 行逐行扫描,但实际像素宽度、SAR、DAR 和裁切区域都可能不同。交付规格应写出完整编码尺寸、帧率、颜色和音频要求。

8.3 只要改 -r 就完成帧率转换

-r 作为输入或输出选项的含义不同;帧率转换可能导致丢帧、重复帧或时间戳调整。处理 VFR 素材时尤其需要先明确目标是保持原始时间节奏,还是强制生成 CFR。

9. 相关链接