使用ffmpeg concat demuxer无损拼接mp4视频所需的通用编码参数有哪些
使用ffmpeg concat demuxer无损拼接MP4需统一的核心参数
你当前遇到的拼接后音画不同步问题,核心是两个输入文件的视频编码规格、时间基、色彩参数未完全匹配,concat demuxer对输入文件的编码参数一致性要求极高,仅统一分辨率、帧率、音频比特率不足以满足要求。
必须统一的核心编码参数
- 视频类参数
- 编码规格:所有输入文件的视频编码标准、profile、level必须完全一致,你当前两个文件都是H.264编码,但一个为Main profile、一个为High profile,参数不匹配
- 时间基(tbn):视频轨道的时间基必须完全一致,你当前第一个文件tbn为19200,第二个为15360,时间基不一致会导致时间戳计算错误,直接引发音画不同步
- 色彩参数:像素格式、色彩 primaries、传输特性、色彩空间必须完全一致,你当前第一个文件色彩空间为bt709,第二个为smpte170m/bt470bg,参数不匹配
- SPS/PPS参数:H.264编码的序列参数集(SPS)和图像参数集(PPS)必须完全一致,不同来源的视频即使分辨率、帧率一致,这两个参数也可能存在差异
- GOP长度:统一关键帧间隔,避免拼接处出现播放卡顿、花屏问题
- 音频类参数
- 编码规格:所有输入文件的音频编码标准、profile必须完全一致,你当前两个文件都是AAC LC编码,该参数符合要求
- 采样参数:采样率、声道数、采样格式必须完全一致,你当前两个文件都是44100Hz、双声道、fltp格式,该参数符合要求
- 时间基:音频轨道的时间基必须完全一致,避免音频时间戳偏移
- 音频帧长度:每帧音频的采样数必须一致,避免拼接处出现音频断层、错位
快速解决操作步骤
你可以通过一次统一转码将两个文件的参数对齐,再使用concat demuxer实现无损拼接,参考命令如下:
- 统一转码第一个视频:
ffmpeg -i WhatsApp_Video_2021-10-20_at_6.45.53_AM-128kb.mp4 -c:v libx264 -profile:v high -level 4.0 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -video_track_timescale 15360 -crf 17 -c:a aac -b:a 128k -ar 44100 -ac 2 1.mp4 - 统一转码第二个视频:
ffmpeg -i TOUT_N_ETAIT_PAS_ENCORE_ACCOMPLI_A_LA_CROIX_DR_N_GUESSAN_MICHEL__136-140__BzQKTvNYwlg__youtube_com.mp4 -c:v libx264 -profile:v high -level 4.0 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -video_track_timescale 15360 -crf 17 -c:a aac -b:a 128k -ar 44100 -ac 2 2.mp4 - 新建
filelist.txt文件,内容如下:
file '1.mp4' file '2.mp4'
- 执行拼接命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
其中-crf 17参数可实现视觉层面的无损输出,你也可以根据画质需求调整该数值。
内容的提问来源于stack exchange,提问作者SebMa
相关产品推荐
相关产品推荐

