用FFmpeg修改视频的像素格式
🎨 像素格式与色彩精度
像素格式决定了视频的色彩表现力和兼容性,选择合适的格式对创作至关重要:
- yuv420p:最广泛的兼容格式,所有播放器和在线平台(B站、YouTube、微信等)都支持。色度信息较少,适合普通视频发布,在文件大小和画质间取得平衡。
- yuv422p 与 yuv444p:保留更多色度信息,色彩精度更高。适合后期调色和绿幕抠像(色键),减少色度溢出边缘。yuv444p是色度无损格式,素材存档的最佳选择。
- 色彩空间:BT.709是高清电视的标准色彩空间,BT.2020是HDR广色域标准。处理HDR视频时需确保像素格式和色彩空间参数正确,否则会导致颜色灰暗或过饱和。
- 深度与带宽:10bit色深(10-bit color)可显示超过10亿种颜色,有效减少色带现象(banding)。8bit是目前主流格式,但在纯色渐变区域可能出现肉眼可见的色阶断层。
什么是像素格式?
像素格式(Pixel Format)决定了视频帧中每个像素的颜色数据如何存储和排列。FFmpeg 使用 -pix_fmt 选项来指定像素格式,它直接影响到视频的文件大小、兼容性和色彩精度。
常用格式:yuv420p / yuv422p / yuv444p
这三种格式都属于 YUV 色彩空间,其中 Y 表示亮度(Luma),U 和 V 表示色度(Chroma)。数字代表色度子采样(Chroma Subsampling)的比例:
yuv420p(4:2:0):每 2×2 像素块共享一组 UV 值。色度信息最少,文件最小,兼容性最好——几乎所有播放器和设备都支持。是 H.264/H.265 编码的默认格式。yuv422p(4:2:2):每行 2 个像素共享一组 UV 值(水平方向减半,垂直方向全保留)。色度信息比 4:2:0 多一倍,色彩更丰富,常用于专业视频制作和采集设备。yuv444p(4:4:4):每个像素独立拥有完整的 Y、U、V 分量。色度信息完全保留,色彩精度最高,文件也最大。适合后期调色、色键抠像(绿幕)等对色彩要求严格的场景。
format 滤镜 vs -pix_fmt 选项
二者功能相同,都能改变输出视频的像素格式:
-pix_fmt yuv420p是输出选项,在整个编码器级别设置像素格式。-vf "format=yuv420p"是视频滤镜,可以在滤镜链的中间环节转换格式。当需要在缩放之后、其他滤镜之前强制指定像素格式时,format滤镜更灵活。
原始 YUV 输入的特殊要求
原始 YUV 文件(.yuv)不包含任何文件头或元数据。FFmpeg 无法自动推断其属性,因此必须显式指定全部参数:
-f rawvideo:强制使用原始视频解复用器-s 1920x1080:分辨率-r 25:帧率-pix_fmt yuv420p:像素格式-i input.yuv:输入文件
缺少任何一个参数都会导致解码错误或输出异常。
广告
{{v.name}}
使用 -pix_fmt 选项,代码如下
$ ffmpeg -i input.mp4 -pix_fmt yuv420p output_yuv420p.mp4
使用 format 滤镜,代码如下
$ ffmpeg -i input.mp4 -filter:v "format=yuv420p" output_yuv420p.mp4
处理原始 YUV 输入数据。原始 YUV 数据没有文件头信息,因此必须指定其像素格式、分辨率和帧数等参数,代码如下
$ ffmpeg -f rawvideo -s 1920x1080 -r 25 -pix_fmt yuv420p -i input.yuv output.mp4
从 Video4Linux2 (V4L2) 设备(如摄像头)采集时,可能需要指定输入和输出的像素格式,代码如下
$ ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -pix_fmt yuv420p output.mp4
在滤镜链中使用 format,代码如下
$ ffmpeg -i input.mp4 -vf "scale=1280:720, format=yuv420p" output.mp4
查看当前 FFmpeg 版本支持哪些像素格式,代码如下
$ ffmpeg -pix_fmts