You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:24:10