数字视频是以离散时间采集的一系列二维图像,并为每张图像保存颜色样本和呈现时间信息的媒体信号。
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. 旋转与显示方向
拍摄设备常把传感器输出按固定方向编码,再在元数据中写入旋转信息。此时“编码尺寸”和“视觉上的宽高”可能交换。对像素级操作(裁剪、缩放、叠加)要先确定策略:
-
让解码器自动按旋转显示,再基于视觉坐标处理;或
-
明确旋转像素并更新输出尺寸,避免依赖播放器是否识别旋转元数据。
两种策略都能成立,但同一次处理的预览坐标、滤镜顺序和输出元数据必须使用同一种坐标模型。
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。