我正在尝试将 FFMPEG 中的 YUV 原始视频从 444 降采样到 422 采样,但问题是输出文件仍然是 444?!帧速率和大小都正确。这是我最近的代码:
ffmpeg -s:v 3840x2160 -r 50 -i input.yuv -vf scale=3840:2160 -c:v rawvideo -pixel_format yuv422p10le output.yuv
答案1
这有点令人困惑:-pixel_format
应用输入并-pix_fmt
应用输出,但也可以用作 的快捷方式-pixel_format
。
假设的像素格式input.yuv
为yuv444p10le
,使用以下命令:
ffmpeg -s:v 3840x2160 -pixel_format yuv444p10le -i input.yuv -c:v rawvideo -pix_fmt yuv422p10le output.yuv
测试:
input.yuv
使用 100 帧 384x216像素格式构建yuv444p10le
:
ffmpeg -y -f lavfi -i testsrc=size=384x216:rate=1:duration=100 -c:v rawvideo -pix_fmt yuv444p10le input.yuv
文件大小为 384*216*100*3*2 = 49,766,400 字节(100 帧、3 个颜色通道和每个组件 2 个字节)。将像素格式转换为
yuv422p10le
:
ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -c:v rawvideo -pix_fmt yuv422p10le output.yuv
文件大小为 384*216*100*2*2 = 33,177,600 字节(100 帧,其中 Y 每分量有 2 个字节,U、V 每 2 个分量有 2 个字节)。
为了测试,我们可以使用 FFplayinput.yuv
进行游戏output.yuv
:
ffplay -framerate 1 -video_size 384x216 -pixel_format yuv444p10le -i input.yuv
ffplay -framerate 1 -video_size 384x216 -pixel_format yuv422p10le -i output.yuv
关于过滤器的说明scale
:
默认情况下使用scale
过滤器,结果与不使用过滤器相同(FFmpeg 内部使用比例过滤器将 yuv444 转换为 yuv422):
ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -vf scale=dst_format=yuv422p10le -c:v rawvideo -pix_fmt yuv422p10le output2.yuv
给出与之前相同的输出。
但是使用scale
过滤器,我们可以有更多的控制权——例如,我们可以选择插值方法:
ffmpeg -y -s:v 384x216 -pixel_format yuv444p10le -i input.yuv -vf scale=sws_flags=lanczos:dst_format=yuv422p10le -c:v rawvideo -pix_fmt yuv422p10le output2.yuv