首页 > 解决方案 > FFmpeg 将视频从帧 OpenCV python 流式传输到 rtmp

问题描述

在工业项目的背景下,我开发了一个实时应用程序来使用 AI 算法检测人。在本地,我获取并显示使用 OPENCV 操作帧的视频。

目标是实现从Opencv帧到rtmp服务器的流视频

FFmpeg 似乎是一个很好的视角。但是,流通常是从 .mp4 或几个 .jpg 到 rtmp 服务器上发布流视频。

谢谢你。

标签: pythonopencvffmpeg

解决方案


首先 ffmpeg 用于将流推送到 rtmp 服务器。您可以尝试为 ffmpeg cammand 创建一个子进程,并通过 PIPE 传递您的帧。

这是您可以尝试的简单示例代码

import subprocess
import cv2
rtmp_url = "rtmp://127.0.0.1:1935/stream/pupils_trace"

# In my mac webcamera is 0, also you can set a video file name instead, for example "/home/user/demo.mp4"
path = 0
cap = cv2.VideoCapture(path)

# gather video info to ffmpeg
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# command and params for ffmpeg
command = ['ffmpeg',
           '-y',
           '-f', 'rawvideo',
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', "{}x{}".format(width, height),
           '-r', str(fps),
           '-i', '-',
           '-c:v', 'libx264',
           '-pix_fmt', 'yuv420p',
           '-preset', 'ultrafast',
           '-f', 'flv',
           rtmp_url]

# using subprocess and pipe to fetch frame data
p = subprocess.Popen(command, stdin=subprocess.PIPE)


while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("frame read failed")
        break

    # YOUR CODE FOR PROCESSING FRAME HERE

    # write to pipe
    p.stdin.write(frame.tobytes())

推荐阅读