FFmpeg录制IP摄像头RTSP流报codec not supported错误如何解决?
错误原因
- 首次MP4封装报错核心为
-map 0参数将输入RTSP流的所有轨道全部写入输出文件,其中索引为1的轨道(通常是异常音频流或冗余元数据流)无有效编码格式,MP4容器不支持写入未知编码轨道,因此触发报错。修改视频编码器不生效是因为报错对象为非视频轨道。 - 改用AVI封装后虽兼容更多编码格式,但RTSP源本身未携带合法数据包时间戳,因此出现DTS非单调、跳帧错误。
解决方案
步骤1:确认输入流轨道信息
先执行以下命令查看RTSP流的所有轨道参数,确认各轨道的编码类型,判断索引1的轨道是有效音频流还是无效冗余流:
ffprobe -rtsp_transport tcp rtsp://192.168.0.250/stream1
步骤2:调整录制命令
场景1:仅需录制视频,不需要音频
直接只映射视频轨道,同时添加时间戳修复参数即可,全程不转码视频,CPU占用极低,保证录制实时性:
ffmpeg -rtsp_transport tcp \ -use_wallclock_as_timestamps 1 \ -fflags +genpts \ -i rtsp://192.168.0.250/stream1 \ -c:v copy \ -map 0:v:0 \ -f segment \ -segment_time 60 \ -segment_format mp4 \ -reset_timestamps 1 \ -movflags +faststart \ "/home/video/stream-%010d.mp4"
场景2:需要同时录制音频
若确认索引1为有效音频流且原始编码不兼容MP4,添加音频转码参数即可:
ffmpeg -rtsp_transport tcp \ -use_wallclock_as_timestamps 1 \ -fflags +genpts \ -i rtsp://192.168.0.250/stream1 \ -c:v copy \ -c:a aac -b:a 128k \ -map 0:v:0 -map 0:a:0 \ -f segment \ -segment_time 60 \ -segment_format mp4 \ -reset_timestamps 1 \ -movflags +faststart \ -avoid_negative_ts make_zero \ "/home/video/stream-%010d.mp4"
核心参数说明
-use_wallclock_as_timestamps 1:用系统时钟作为数据包的时间戳,解决原始RTSP流无时间戳的问题-fflags +genpts:自动生成缺失的显示时间戳(PTS)-reset_timestamps 1:每个分段文件的时间戳从0开始,避免播放器播放异常-avoid_negative_ts make_zero:将负时间戳修正为0,解决DTS非单调报错
内容的提问来源于stack exchange,提问作者Kracozebr
相关产品推荐
相关产品推荐

