FFmpeg拼接不同分辨率视频时进程卡顿的解决方法
解决FFmpeg拼接视频时卡顿与高CPU占用问题
问题根源
从输出日志可定位核心问题:
- 帧率不匹配:第一个视频为30fps,第二个为29.97fps,
concat滤镜为同步流会大量重复/丢弃帧,直接导致CPU负载飙升 - 音频参数不一致:第一个视频音频采样率44100Hz,第二个为48000Hz,强制同步增加额外处理开销
- 编码级别超限:输出视频MB rate超过H.264 level限制,触发高复杂度编码逻辑
修正后的命令
ffmpeg -y -i video_1.mp4 -i video_2.mp4 \ -filter_complex '[0]scale=426:240:force_original_aspect_ratio=decrease,pad=426:240:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=29.97[v0];[1]scale=426:240:force_original_aspect_ratio=decrease,pad=426:240:(ow-iw)/2:(oh-ih)/2,setsar=1[v1];[0:a]aresample=48000[a0];[v0][a0][v1][1:a]concat=n=2:v=1:a=1[v][a]' \ -map '[v]' -map '[a]' -c:v libx264 -level 3.0 -preset medium -c:a aac concatenated_video.mp4
关键修改说明
- 统一帧率:给第一个视频添加
fps=29.97,对齐第二个视频帧率,消除帧重复/丢弃的情况 - 统一音频采样率:用
aresample=48000将第一个视频音频采样率转成48000Hz,与第二个视频一致,避免音频同步开销 - 限制编码级别:添加
-level 3.0,符合426x240分辨率的标准编码级别,降低编码复杂度 - 优化编码预设:
-preset medium在压缩率和编码速度间取平衡,进一步降低CPU负载
可选调整
若想保留30fps帧率,只需给第二个视频滤镜链添加fps=30,同时将音频采样率统一为44100Hz:
ffmpeg -y -i video_1.mp4 -i video_2.mp4 \ -filter_complex '[0]scale=426:240:force_original_aspect_ratio=decrease,pad=426:240:(ow-iw)/2:(oh-ih)/2,setsar=1[v0];[1]scale=426:240:force_original_aspect_ratio=decrease,pad=426:240:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30[v1];[1:a]aresample=44100[a1];[v0][0:a][v1][a1]concat=n=2:v=1:a=1[v][a]' \ -map '[v]' -map '[a]' -c:v libx264 -level 3.0 -preset medium -c:a aac concatenated_video.mp4
内容的提问来源于stack exchange,提问作者knagode
相关产品推荐
相关产品推荐

