FFmpeg分段下载视频后拼接出现卡顿的解决方法
解决分段下载视频拼接卡顿问题
问题根源
你用-ss %offset% -t 30切割MP4时,由于MP4依赖关键帧才能播放,ffmpeg会自动将起始点调整到最近的前向关键帧,导致实际片段时长超过30秒,拼接时片段重叠,出现卡顿。
解决方案
1. 改用TS格式分段+精确切割命令
TS是流式容器,无需严格依赖关键帧即可播放,切割和拼接稳定性更高,适合分段下载场景:
- 伪代码计算时间范围:
%start_offset% = 30 * %part% %end_offset% = 30 * (%part% + 1) - 分段下载命令:
ffmpeg -ss %start_offset% -to %end_offset% -accurate_seek -i INPUT_FILE -c copy -bsf:v h264_mp4toannexb out%part%.ts-accurate_seek:强制按指定时间点精确切割,不自动偏移到关键帧-to:指定片段结束时间,比-t更可靠(-t是持续时间,起始点偏移后实际时长会失控)-bsf:v h264_mp4toannexb:将MP4封装的H.264转成TS兼容格式,保证片段可正常拼接
2. 拼接TS片段
使用原concat命令即可,concat.txt内容:
file 'out0.ts' file 'out1.ts'
拼接命令:
ffmpeg -safe 0 -f concat -i concat.txt -c copy final.mp4
3. 若坚持用MP4分段的优化方案
如果必须输出MP4片段,需强制ffmpeg按精确时间生成片段(需重新编码,耗时较高,不推荐Android服务场景使用):
ffmpeg -ss %start_offset% -t 30 -i INPUT_FILE -c:v libx264 -c:a aac -avoid_negative_ts 1 out%part%.mp4
重新编码会生成严格30秒的片段,拼接时不会重叠,但会占用更多CPU和时间。
4. 进阶:基于关键帧对齐分段(适合MP4)
先提取视频所有关键帧的时间点:
ffmpeg -i INPUT_FILE -vf "select='eq(pict_type,PICT_TYPE_I)'" -f null - 2>&1 | grep "pts_time"
然后根据关键帧时间调整%start_offset%和%end_offset%,让每个片段的起始、结束都落在关键帧位置,避免ffmpeg自动调整时长,拼接时就不会出现重叠或间隙。
内容的提问来源于stack exchange,提问作者rnbwSmn
相关产品推荐
相关产品推荐

