使用FFmpeg无损截取视频后播放卡顿的原因及解决方法
FFmpeg截取视频卡顿问题的解决方法
问题原因
你使用-vcodec copy和-acodec copy直接复制音视频流时,-ss放在-i参数之后,FFmpeg会先解码视频到指定时间点再复制流。如果起始时间点(00:02:00)不是视频的关键帧,会导致输出文件的时间戳混乱,加上原视频可能存在编码信息不完整的情况,就会触发日志中的pts has no value等错误,最终导致播放卡顿。
解决方法
方法1:调整-ss位置并修正时间戳
将-ss放在输入文件参数前,让FFmpeg快速定位到最接近起始时间的关键帧,同时添加时间戳修正参数:
ffmpeg -ss 120 -t 90 -i input.mp4 -vcodec copy -acodec copy -avoid_negative_ts make_zero output.mp4
-ss前置:FFmpeg会利用视频索引直接跳转到关键帧,避免解码大量非关键帧,同时保证流复制的时间戳完整性-avoid_negative_ts make_zero:强制输出文件的时间戳从0开始,修复日志中提示的时间戳未设置问题
方法2:重新编码(兼容性最优)
如果直接复制流的方式仍有问题,放弃copy参数,重新编码生成完整的视频文件:
ffmpeg -ss 120 -t 90 -i input.mp4 -c:v libx264 -c:a aac output.mp4
重新编码会生成标准的关键帧和正确的时间戳,彻底解决时间戳异常和播放卡顿问题,适合原视频编码格式存在缺陷的场景。
方法3:精确截取+时间戳修正
如果需要毫秒级的精确截取,结合-ss后置、-copyts和时间戳修正参数:
ffmpeg -i input.mp4 -ss 120 -t 90 -vcodec copy -acodec copy -copyts -avoid_negative_ts make_zero output.mp4
-copyts:保留原视频的时间戳信息,保证截取精度-avoid_negative_ts make_zero:修正可能出现的负时间戳,避免播放器解析错误
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

