使用ffmpeg抓取IP摄像头HEVC/H265 RTSP流输出视频出现绿条问题求助
问题原因分析
你遇到的绿条故障本质是H265码流解码时帧信息不完整导致的,当前你用的-vcodec copy流复制模式下,ffmpeg不会对码流做任何修正,只要出现以下任意一种情况就会出现花屏、绿条:
- RTSP默认走UDP传输,网络波动导致码流NALU单元丢包,帧数据不完整
- 摄像头输出的H265流没有在每个关键帧前携带SPS/PPS参数集,拉流起始阶段没抓到参数集就会导致后续所有帧解码出错
- MP4容器打包H265流时缺少必要的格式转换参数,导致封装后的文件头信息异常
你使用的node-rtsp-recorder默认生成的ffmpeg参数只适配了基础的H264流录制,没有兼容H265流的特殊配置,是问题的核心诱因。
解决方案
- 优先修改ffmpeg调用参数,新增RTSP传输协议配置,强制走TCP避免丢包:
给spawnargs数组插入'-rtsp_transport', 'tcp'参数,插入位置在'-i'之前,修改后参数如下:spawnargs: [ 'ffmpeg', '-rtsp_transport', 'tcp', '-i', 'rtsp://[...]', '-vcodec', 'copy', 'videos/cam1/Aug-26th-21/video/2021-8-26-5-51-13.mp4' ] - 如果修改传输协议后仍有绿条,新增H265码流过滤参数,补充封装所需的头信息:
在-vcodec copy后面新增'-bsf:v', 'hevc_metadata'参数,自动补全H265流的元信息 - 上述方案都无效的话,放弃流复制,改用软转码模式,ffmpeg会自动修正错误帧:
把'-vcodec', 'copy'替换为'-vcodec', 'libx265', '-crf', '28',CRF值可根据画质需求调整,数值越小画质越高、文件越大 - 额外排查项:确认摄像头的编码配置为固定分辨率、固定GOP,关闭动态码率之外的动态编码参数,避免流格式频繁变化导致封装异常
故障效果参考

内容的提问来源于stack exchange,提问作者hendyman
相关产品推荐
相关产品推荐

