python实现相机流推送到go2rtc
·
go2rtc 提供了一个 HTTP API,允许你将每一帧图像(必须是 JPEG 格式)直接推送到一个预先定义好的“空流”中。
下面是基于这个方法的具体步骤和代码,这种方式跳过了复杂的 GStreamer 管道配置,让你的 Python 代码更清晰。
📝 准备工作:配置 go2rtc
你需要先让 go2rtc 运行起来,并创建一个“空流”作为接收端。
-
创建配置文件
go2rtc.yaml
在 go2rtc 的工作目录下创建这个文件,内容如下。这会创建一个名为mystream的流,但初始时它没有任何视频源,等待你的 Python 程序通过 API 填入数据。streams: mystream: # 定义你的流名称 api: listen: ":1984" # API 服务默认监听端口 rtsp: listen: ":8554" # RTSP 服务默认监听端口 -
启动 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 地址。
更多推荐

所有评论(0)