大华摄像头开麦后FFmpeg录制RTSP转MP4速度飙至60倍问题咨询
问题根因
该故障由大华IPC-EW5541-AS、IPC-HDBW4231F-AS两款型号的固件RTSP时间戳逻辑缺陷导致:
- 摄像头开启麦克风后,前2-5分钟RTSP流时间戳保持正常,之后音频流会出现时间戳跳变、时基漂移问题
- 命令中添加的
-an参数仅会丢弃音频流的编码输出,不会阻止FFmpeg在RTSP解复用阶段读取音频流时间戳参与全局时长计算 - 异常的音频时间戳会污染全局时间基准,导致FFmpeg误判流播放速度(即日志中显示的60x左右speed),
segment分片器基于错误时间戳计算时长,原本60秒的分片阈值被误判为1秒左右,触发频繁分片 - 同品牌IPC-HDW4433C-A型号无该固件缺陷,因此运行正常;麦克风关闭时摄像头不发送音频流,也不会触发问题。
解决方案
按优先级从高到低选择以下可直接落地的方案:
- 方案1:拉流时直接屏蔽音频流协商(最推荐,零额外开销,不影响并行采音)
在输入参数前添加-allowed_media_types video,让FFmpeg与摄像头建立RTSP连接时仅请求视频流,从源头上不接收音频RTP包,完全规避音频时间戳干扰。修改后的完整命令如下:
该方案不影响其他脚本单独发起RTSP连接拉取音频流,不同连接的流协商完全独立。ffmpeg -rtsp_transport tcp -allowed_media_types video -i 'rtsp://<USER>:<PASSWORD>@<CAMERA_ADDRESS>' -vcodec copy -dn -y -segment_time 60 -strftime 1 -reset_timestamps 1 -f segment %Y-%m-%d-%H-%M.mp4 - 方案2:强制使用本地接收时间戳替代摄像头流自带时间戳
若使用的FFmpeg版本过低不支持-allowed_media_types参数,可在输入前添加-use_wallclock_as_timestamps 1,让FFmpeg以本地收到数据包的系统时间作为时间戳,完全忽略摄像头下发的错误时间戳。核心命令如下:
该方案存在数百毫秒级的时间误差,适合对时间精度要求不高的场景。ffmpeg -rtsp_transport tcp -use_wallclock_as_timestamps 1 -i 'rtsp://<USER>:<PASSWORD>@<CAMERA_ADDRESS>' -vcodec copy -an -dn -y -segment_time 60 -strftime 1 -reset_timestamps 1 -f segment %Y-%m-%d-%H-%M.mp4 - 方案3:音视频拉流进程完全隔离
若需要同时录制音视频,禁止在同一个FFmpeg进程中同时拉取该型号摄像头的音视频流:- 第一个进程使用方案1的参数单独拉取视频流,完成60秒分片逻辑
- 第二个进程单独拉取音频流存储为独立文件
后续需要合成完整音视频录像时,按录制起始时间对齐合并即可,完全规避音频时间戳污染视频分片逻辑的问题。
内容的提问来源于stack exchange,提问作者przemoch
相关产品推荐
相关产品推荐

