如何用FFmpeg将视频分割为奇偶场独立文件并编码合并?
没问题,我来一步步帮你搞定这个隔行视频的场分割、编码和合并流程——全程用ffmpeg就能完成,操作起来很清晰:
步骤1:从隔行YUV中分割奇数场(顶场)和偶数场(底场)
你可以用ffmpeg的fieldsplit滤镜直接分离两场,这个滤镜会自动把原640x480的隔行视频拆成640x240的逐行视频,分别对应奇数行(顶场)和偶数行(底场):
- 提取奇数场(对应原视频的第1、3、5…行):
ffmpeg -s 640x480 -pix_fmt yuv420p -i input_interlaced.yuv -vf "fieldsplit=top" -pix_fmt yuv420p odd_field.yuv
- 提取偶数场(对应原视频的第2、4、6…行):
ffmpeg -s 640x480 -pix_fmt yuv420p -i input_interlaced.yuv -vf "fieldsplit=bottom" -pix_fmt yuv420p even_field.yuv
注意:如果你的源YUV不是
yuv420p格式(比如yuv422p),请把命令里的-pix_fmt参数改成对应的格式——ffmpeg必须准确识别源文件的像素格式才能正确处理。
步骤2:分别编码两个场的YUV文件
接下来把分割好的两个640x240 YUV文件编码成你需要的格式(这里以常用的H.264为例):
- 编码奇数场视频:
ffmpeg -s 640x240 -pix_fmt yuv420p -i odd_field.yuv -c:v libx264 -crf 23 -preset medium odd_encoded.mp4
- 编码偶数场视频:
ffmpeg -s 640x240 -pix_fmt yuv420p -i even_field.yuv -c:v libx264 -crf 23 -preset medium even_encoded.mp4
小提示:
-crf 23是H.264的质量控制参数,数值越小质量越高(范围0-51),默认23是均衡的选择;-preset medium是压缩速度参数,从ultrafast到veryslow,速度越慢压缩率越高,质量也会稍好;- 如果需要编码成其他格式,替换
libx264为对应的编码器即可(比如libx265)。
步骤3:将编码后的两场视频合并为隔行扫描文件
最后把两个编码后的视频合并回640x480的隔行扫描视频,这里需要用mergefields滤镜将两场重新组合,并明确告诉编码器输出隔行格式:
ffmpeg -i odd_encoded.mp4 -i even_encoded.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS[top];[1:v]setpts=PTS-STARTPTS[bottom];[top][bottom]mergefields=top_first" -c:v libx264 -x264opts "interlaced=1:tff=1" output_interlaced.mp4
关键参数说明:
mergefields=top_first:指定顶场(奇数场)优先显示,对应TFF(Top Field First)格式;如果你的原视频是底场优先(BFF),改成mergefields=bottom_first即可;-x264opts "interlaced=1:tff=1":强制x264编码器输出隔行扫描视频,tff=1对应顶场优先,tff=0对应底场优先。
注意:一定要确保两个编码后的视频帧率、时长完全一致,否则合并后会出现不同步的问题。如果出现时长不一致,可以在编码时加上
-r <帧率>参数强制指定相同帧率。
内容的提问来源于stack exchange,提问作者Robby Ward




