FFmpeg编码添加文本后无损拼接多视频的归一化方案咨询
解决思路
要使用concat demuxer实现无损(不重编码)拼接,要求所有待拼接文件的视频编码格式、帧率、时间基(tbn)、色彩空间参数、H.264 profile/level,以及音频编码格式、采样率、声道数、码率参数完全一致。你遇到的报错就是因为第一步编码时没有强制统一这些参数,FFmpeg默认继承了源文件的部分参数导致输出文件规格不统一。
第一步:修改批量编码命令,强制参数归一化
修正后的编码命令如下,所有会影响拼接的参数全部硬编码固定,同时修正了你原命令中pix_fmt和-vf之间缺空格的笔误:
ffmpeg -i input.1.mp4 \ # 视频编码参数统一 -vcodec libx264 -profile:v high -level 4.1 \ -r 30 -video_track_timescale 15360 \ -pix_fmt yuv420p -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m \ # 视频滤镜(缩放+水印) -vf "scale=1920:-2, drawtext=fontfile=./roboto.ttf: fontsize=40: text='ABC': x=(w-text_w)-w/20: y=(h-text_h)-h/20" \ # 音频参数统一 -acodec aac -ar 48000 -ac 2 -b:a 128k \ -y export/out.1.mp4
关键参数说明:
-r 30:强制输出视频帧率固定为30fps,不会再出现30.04fps、29fps的不一致情况-video_track_timescale 15360:强制视频时间基(tbn)统一为15360,解决时间基不一致导致的DTS错乱问题- 色彩相关参数:统一所有文件的色彩空间配置,避免拼接后出现画面色彩跳变
- 音频参数:强制采样率48kHz、双声道、固定128k码率,不会再出现44.1kHz采样率、超低码率的异常音频流
第二步:执行无损拼接
第一步所有文件编码完成后,直接使用你原来的concat demuxer命令即可,可额外加-fflags +genpts参数自动修正可能的时间戳小问题:
ffmpeg -safe 0 -f concat -fflags +genpts \ -i <(find ./export/ -type f -printf "file '$PWD/%p'\n" | sort) \ -c copy concat.out.mp4
该命令全程不会重编码音视频流,拼接速度仅和硬盘读写速度挂钩,不会占用大量CPU资源,输出文件无画质损失。
内容的提问来源于stack exchange,提问作者BDR
相关产品推荐
相关产品推荐

