FFmpeg移除视频中间片段后切割点出现卡顿抖动的解决方法(要求不重新编码)
FFmpeg移除视频中间片段后切割点出现卡顿抖动的解决方法(要求不重新编码)
嘿,我太懂这种卡顿的烦躁感了!问题根源其实很简单:你选的切割点(60秒和200秒)大概率不在视频的关键帧上。FFmpeg用concat直接拼接非关键帧位置的片段时,播放器没法立刻解码播放那个位置的画面,必须从最近的前一个关键帧开始解码,这就导致了短暂的抖动和卡顿。
下面给你几个不用重新编码就能解决的办法,亲测有效:
1. 先定位关键帧,调整切割点到关键帧位置
首先得找出视频里所有关键帧的时间点,用这条命令:
ffmpeg -i video.mp4 -vf "showinfo" -f null - 2>&1 | grep -E "key_frame:1|pts_time"
运行后你会看到一堆输出,找到key_frame:1对应的pts_time值,比如找刚好小于等于60秒的关键帧时间(比如58.2秒),以及刚好大于等于200秒的关键帧时间(比如201.5秒)。
然后修改你的input.txt,把切割点换成这些关键帧时间:
file video.mp4 outpoint 58.2 file video.mp4 inpoint 201.5
2. 加上时间戳修正参数
在concat命令里加上-avoid_negative_ts make_zero,这个参数能帮你修正拼接后的视频时间戳,避免播放器因为时间戳不连续出现卡顿。最终命令变成:
ffmpeg -f concat -i input.txt -c copy -avoid_negative_ts make_zero output.mp4
3. 先单独提取片段再拼接(备选方案)
如果上面的方法还是不行,可以先把两段视频单独提取出来,再拼接,这样能规避一些容器元数据的问题:
- 提取前半段:
ffmpeg -i video.mp4 -t 58.2 -c copy part1.mp4
- 提取后半段:
ffmpeg -i video.mp4 -ss 201.5 -c copy part2.mp4
- 新建一个
parts.txt,内容如下:
file part1.mp4 file part2.mp4
- 最后拼接:
ffmpeg -f concat -i parts.txt -c copy -avoid_negative_ts make_zero output.mp4
这些方法全程都是直接复制视频流,完全不会重新编码,速度快还能保证画质不变,应该能解决你的卡顿问题!
备注:内容来源于stack exchange,提问作者Mohammad Mansour
相关产品推荐
相关产品推荐

