FFmpeg接收RTSP流音视频不同步求助(含Non-monotonous DTS报错)
解决RTSP推流中的DTS报错与音视频不同步问题
首先,咱们先拆解你遇到的两个核心问题:Non-monotonous DTS报错和视频延迟/音视频不同步。这个DTS报错本质是音频流的解码时间戳出现了非递增的情况,FFmpeg处理时会因为时间戳混乱导致同步逻辑出错,同时网络传输的缓存策略也会放大延迟问题。下面给你针对性的解决方案:
一、修复发送端(VLC)的时间戳与缓存配置
你的VLC推流命令在转码环节可能没有强制规范时间戳,加上缓存过大导致延迟。调整后的命令如下:
cvlc -vvv /home/sana/lab/video-server1/1.avi \ --sout '#transcode{vcodec=h264,vb=3000,scale=Auto,acodec=mp3,ab=128,channels=2,samplerate=44100,fps=25,deinterlace}:rtp{dst=10.0.0.2,port=1234,sdp=rtsp://10.0.0.1:8554/test1.sdp}' \ --clock-synchro=0 \ --sout-mux-caching=100
关键调整点:
- 将音频采样率改为
44100(多数视频源的标准采样率,避免低采样率转换时的时间戳错位); - 新增
fps=25(替换为你源视频的实际帧率),强制统一视频帧率,避免转码时时间戳跳变; --clock-synchro=0禁用VLC的时钟同步,防止推流时时间戳偏移;--sout-mux-caching=100将推流缓存降至100ms,减少发送端的延迟堆积。
二、优化接收端(FFmpeg)的时间戳修复与延迟控制
FFmpeg默认对异常时间戳的容错性有限,加上RTSP默认用UDP传输容易丢包,导致时间戳混乱。调整后的命令:
ffmpeg -fflags +genpts -rtsp_transport tcp -i rtsp://10.0.0.1:8554/test1.sdp -max_delay 0 -flags low_delay -acodec copy -vcodec copy /home/sana/lab/mrp/test1.avi
关键调整点:
-fflags +genpts强制FFmpeg为流生成递增的PTS/DTS,直接解决Non-monotonous DTS报错;-rtsp_transport tcp改用TCP传输RTSP,UDP丢包会导致时间戳断裂,TCP的可靠性能避免这个问题;-max_delay 0和-flags low_delay最小化FFmpeg的解码缓存,减少视频延迟。
三、额外排查:修复源文件本身的时间戳问题
如果上述调整后问题仍存在,可能是源文件1.avi本身的时间戳就不规范。可以先用FFmpeg分析源文件:
ffmpeg -i /home/sana/lab/video-server1/1.avi -v trace 2>&1 | grep -E "dts|pts"
如果输出中出现DTS/PTS跳变的情况,先修复源文件:
ffmpeg -i /home/sana/lab/video-server1/1.avi -c:v h264 -c:a mp3 -fflags +genpts /home/sana/lab/video-server1/fixed.avi
用修复后的fixed.avi作为推流源,再重复前面的推流/拉流操作。
内容的提问来源于stack exchange,提问作者sana
相关产品推荐
相关产品推荐

