如何通过Python将经YOLOv5s处理的视频流推送到RTSP地址?
可行的Python实现方案
核心思路
用OpenCV读取RTSP流,YOLOv5s完成目标检测并绘制边界框,通过FFmpeg子进程推流到Azure直播媒体的目标RTSP地址。这种方式规避了OpenCV原生VideoWriter对RTSP推流支持不足的问题,稳定性更强。
完整代码
import cv2 import torch import subprocess import sys # 配置参数 input_rtsp_url = "你的输入RTSP地址" output_rtsp_url = "你的Azure目标RTSP地址" # 加载YOLOv5s模型(两种方式二选一) # 方式1:从PyTorch Hub在线加载 model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) # 方式2:本地YOLOv5仓库加载(需提前克隆仓库到本地) # model = torch.hub.load('./yolov5', 'yolov5s', source='local', pretrained=True) # 初始化RTSP流捕获 cap = cv2.VideoCapture(input_rtsp_url) if not cap.isOpened(): print("无法打开输入RTSP流") sys.exit(1) # 获取原视频参数(用于推流匹配) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) if fps <= 0: fps = 25 # 无法获取帧率时默认设置为25 # 构建FFmpeg推流命令(适配Azure RTSP要求) ffmpeg_cmd = [ 'ffmpeg', '-y', # 覆盖已有输出 '-f', 'rawvideo', '-vcodec', 'rawvideo', '-pix_fmt', 'bgr24', # 匹配OpenCV的BGR帧格式 '-s', f'{frame_width}x{frame_height}', '-r', str(fps), '-i', '-', # 从标准输入读取帧数据 '-c:v', 'libx264', '-preset', 'ultrafast', # 实时编码预设,优先保证速度 '-tune', 'zerolatency', # 零延迟调优,适配直播场景 '-pix_fmt', 'yuv420p', '-f', 'rtsp', '-rtsp_transport', 'tcp', # 使用TCP传输避免UDP丢包 output_rtsp_url ] # 启动FFmpeg子进程 try: ffmpeg_process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE) except Exception as e: print(f"启动FFmpeg失败: {str(e)}") cap.release() sys.exit(1) # 循环处理帧并推流 print("开始处理并推流...") while cap.isOpened(): ret, frame = cap.read() if not ret: print("无法读取帧,退出循环") break # YOLOv5目标检测 results = model(frame) # 将检测结果的边界框绘制到帧上 frame = results.render()[0] # 把帧数据写入FFmpeg标准输入 try: ffmpeg_process.stdin.write(frame.tobytes()) except BrokenPipeError: print("FFmpeg进程异常终止") break # 清理资源 cap.release() ffmpeg_process.stdin.close() ffmpeg_process.wait() print("推流结束,资源已释放")
关键注意事项
- FFmpeg安装:确保系统已安装FFmpeg并加入环境变量。Windows用户可从FFmpeg官网下载后添加到PATH;Linux用户执行
sudo apt install ffmpeg;Mac用户执行brew install ffmpeg。 - Azure RTSP验证:确认目标RTSP地址格式正确,且账号拥有推流权限,Azure直播媒体的RTSP地址通常为
rtsp://[域名]/[容器]/[流名称]格式。 - 依赖安装:执行
pip install torch opencv-python安装YOLOv5和OpenCV的依赖包。 - 性能优化:若检测速度不足,可缩小输入帧尺寸后再检测,完成后缩放回原尺寸推流;或替换为更轻量的YOLOv5n模型。
- 错误排查:若FFmpeg报错,可在命令中添加
-v debug参数查看详细日志,定位编码不支持、RTSP连接失败等问题。
内容的提问来源于stack exchange,提问作者dager234
相关产品推荐
相关产品推荐

