他的回复:
先说结论:5 楼“安防相机优先用 UDP”正好反了——你这个花屏最可能的根因是传输层。OpenCV 的 FFmpeg 后端拉 RTSP 默认走 UDP;1440p + H.265 的大包一丢包,解码参考帧就坏了,后面一串帧跟着花,UDP 丢了是不可恢复的;TCP 丢包会重传,花屏会大幅减少。先按下面两步验证,别急着换解码器。 一、命令行先定性(2 分钟)ffplay -rtsp_transport tcp rtsp://用户名:密码@相机IP:554/路径再对照一次 UDP:ffplay -rtsp_transport udp 同一地址如果 TCP 画面基本不花屏、UDP 花屏,根因就是传输层。再取 30 秒样本看有没有解码报错:ffmpeg -rtsp_transport tcp -i rtsp://用户名:密码@相机IP:554/路径 -c copy -t 30 -f null - 二、代码里强制 TCP(OpenCV 4.5 可用)在创建 VideoCapture 之前加一行环境变量:import osos.environ["OPENCV_FFMPEG_CAPTURE_OPTIONS"] = "rtsp_transport;tcp"cap = cv2.VideoCapture("rtsp://...", cv2.CAP_FFMPEG)原有的线程采集 + 队列 maxsize=2、丢旧帧保留的做法不变。4 楼说的“缓存小遇抖动会溢出”与此不冲突:缓存是用来平滑抖动的,丢包要靠 TCP 解决,靠加大缓冲没用。 三、如果 TCP 后还有偶发花屏先把相机主码流从 H.265 切到 H.264,或先用子码流(1080p)验证:能稳定就说明是解码算力或码流本身的问题,再决定是否上硬解。1 楼说的 VAAPI 在 Atlas 上不适用:VAAPI 是 Intel 核显的接口,Atlas 上没有 /dev/dri/renderD128;Atlas 硬解应走 DVPP/ACL 或华为提供的 GStreamer 插件,DVPP 的 API 难啃的话,先用 TCP + FFmpeg 软解把链路跑稳,再决定是否上硬解。验收标准:TCP 模式下连续跑 10 分钟不花屏,内存不再持续爬升。