go2rtc 提供了一个 HTTP API,允许你将每一帧图像(必须是 JPEG 格式)直接推送到一个预先定义好的“空流”中。

下面是基于这个方法的具体步骤和代码,这种方式跳过了复杂的 GStreamer 管道配置,让你的 Python 代码更清晰。

📝 准备工作:配置 go2rtc

你需要先让 go2rtc 运行起来,并创建一个“空流”作为接收端。

  1. 创建配置文件 go2rtc.yaml
    在 go2rtc 的工作目录下创建这个文件,内容如下。这会创建一个名为 mystream 的流,但初始时它没有任何视频源,等待你的 Python 程序通过 API 填入数据。

    streams:
      mystream:  # 定义你的流名称
    
    api:
      listen: ":1984"  # API 服务默认监听端口
    
    rtsp:
      listen: ":8554"  # RTSP 服务默认监听端口
    
  2. 启动 go2rtc
    在终端中运行 go2rtc 程序,它会自动加载同目录下的 go2rtc.yaml 配置文件。

    ./go2rtc
    

🐍 Python 推流代码

下面的 Python 代码使用 OpenCV 读取摄像头,然后将每一帧编码为 JPEG,并通过 go2rtc 的 API 推送出去。

import cv2
import requests
import time

# --- 配置参数 ---
GO2RTC_API_URL = "http://localhost:1984/api/stream?dst=mystream"  # 推送目标地址
STREAM_NAME = "mystream"          # 与配置文件中定义的流名称一致
FPS = 30                          # 设置一个合适的帧率

# --- 1. 打开摄像头 ---
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 设置摄像头的分辨率(可选)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

print(f"开始向 {GO2RTC_API_URL} 推送流...")

# --- 2. 创建并保持一个 HTTP 会话 (重要!) ---
# 根据 go2rtc 开发者的建议,应该使用同一个连接来发送所有帧
session = requests.Session()

# --- 3. 主循环:读取、编码、发送 ---
while True:
    ret, frame = cap.read()
    if not ret:
        print("无法获取视频帧")
        break

    # 将帧编码为 JPEG 格式
    # 注意:必须发送 JPEG 格式的二进制数据,而不是原始像素数据
    _, img_encoded = cv2.imencode('.jpg', frame)
    img_bytes = img_encoded.tobytes()

    # 通过同一个 session 发送 POST 请求
    try:
        response = session.post(GO2RTC_API_URL, data=img_bytes)
        # 可以根据需要检查响应状态,但非必须
        # if response.status_code != 200:
        #     print(f"发送失败: {response.status_code}")
    except Exception as e:
        print(f"请求发生错误: {e}")
        break

    # 控制帧率,避免过度消耗 CPU
    time.sleep(1.0 / FPS)

    # 可选:按 'q' 键退出
    # if cv2.waitKey(1) & 0xFF == ord('q'):
    #     break

# --- 4. 释放资源 ---
cap.release()
session.close()
cv2.destroyAllWindows()

▶️ 在 VLC 中播放

运行上面的 Python 脚本,当它开始推送数据后,打开 VLC 播放器,选择“媒体” -> “打开网络串流”,输入以下地址即可播放:
rtsp://localhost:8554/mystream

如果 VLC 在其他设备上,将 localhost 替换为运行 go2rtc 的电脑的 IP 地址。

更多推荐