You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:39