如何用FFmpeg将视频像素格式改为yuv420p(tv, progressive)?
我有视频文件in.mp4,其视频流参数为:
Stream #0:00x1: Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 375 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
希望将其转换为指定规格:修改时基为30k、添加空音频流、视频profile改为Main,像素格式保持yuv420p(tv, progressive),目标参数为:
Stream #0:00x1: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 20744 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)
当前使用的FFmpeg命令:
ffmpeg -f lavfi -i anullsrc -i in.mp4 -c:v libx264 -pix_fmt yuv420p -profile:v main -video_track_timescale 30k -c:a aac -map 0:a -map 1:v -shortest out.mp4
输出的out.mp4音频流符合要求,但视频流像素格式为yuv420p(progressive),缺失tv标识。
我的假设:
- 音视频流顺序改变不影响
- 音视频码率变化可接受,因h264和aac为非固定码率
缺失tv标识是因为libx264编码器默认使用PC色彩范围,而原视频采用的是TV色彩范围。需要在命令中明确指定色彩范围相关参数,即可恢复该标识。
修改后的FFmpeg命令:
ffmpeg -f lavfi -i anullsrc -i in.mp4 -c:v libx264 -pix_fmt yuv420p -profile:v main -video_track_timescale 30k -color_range tv -colorspace bt709 -color_trc bt709 -color_prim bt709 -c:a aac -map 0:a -map 1:v -shortest out.mp4
参数说明:
-color_range tv:核心参数,直接指定色彩范围为TV标准,对应像素格式中的tv标识-colorspace bt709、-color_trc bt709、-color_prim bt709:匹配主流TV视频的色彩空间、传输特性和原色标准,确保视频色彩属性完全符合原视频的tv规格要求
执行该命令后,输出视频的像素格式会显示为yuv420p(tv, progressive),同时满足其他所有转换要求。
内容的提问来源于stack exchange,提问作者Roy

