FFmpeg拼接RTSP流片段后视频损坏问题求助
解决方案
一、调整捕获参数,让片段支持快速-c copy拼接
问题根源在于直接捕获的RTSP片段时间戳不连续,且未标准化容器参数。修改捕获命令,确保每个2分钟片段的时间戳从0开始,同时保留原生编码(避免转码损耗):
ffmpeg -rtsp_transport tcp -i <rtsp_url> -t 120 -c:v copy -c:a copy -reset_timestamps 1 -movflags +faststart part_%03d.mp4
参数说明:
-t 120:强制录制120秒(2分钟),避免RTSP断开时生成不完整片段-c:v copy -c:a copy:直接复制音视频流,无转码,速度最快-reset_timestamps 1:将当前片段的时间戳重置为0,消除跨片段的时间戳冲突-movflags +faststart:把MP4的索引信息移到文件开头,便于后续拼接和播放
二、正确拼接标准化后的片段
- 生成片段列表文件
parts_list.txt,格式必须为:
file 'part_001.mp4' file 'part_002.mp4' file 'part_003.mp4' ... # 共30个片段,对应1小时
- 执行拼接命令,再次重置全局时间戳保证连续性:
ffmpeg -safe 0 -f concat -i parts_list.txt -c copy -reset_timestamps 1 final_1h.mp4
此命令全程无转码,CPU占用极低,且不会出现Non-monotonous DTS警告,播放完全流畅。
三、修复已捕获的非标准化片段
如果已经有之前录制的问题片段,先逐个修复时间戳,再拼接:
# 修复单个片段 ffmpeg -i old_part.mp4 -c copy -reset_timestamps 1 fixed_part.mp4
修复完成后,按上述第二步的方法拼接即可。
问题原因说明
- 最初的捕获未重置时间戳,新RTSP流的时间戳可能与前一片段不连续(甚至回退),导致拼接后容器时间线混乱,出现
Non-monotonous DTS警告和播放卡顿 exiftool看到的时长不一致,是容器因时间戳冲突无法正确计算总时长导致的
内容的提问来源于stack exchange,提问作者555Russich
相关产品推荐
相关产品推荐

