FFmpeg 将视频从帧 OpenCV python 流传输到 rtmp

问题描述 投票:0回答:2

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

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

FFmpeg 似乎是一个不错的视角。然而,通常流是从 .mp4 或几个 .jpg 出发,在 rtmp 服务器上发布流视频。

谢谢你。

python opencv ffmpeg
2个回答
12
投票

首先,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())

0
投票

该代码使用 OpenCV 的 VideoCapture 函数从相机或视频文件中捕获帧。 然后,它提取帧属性,例如帧速率 (fps)、宽度和高度。 使用 Python 的 subprocess 模块创建子进程,该模块运行 ffmpeg 命令来编码视频帧并将其流式传输到指定的 RTMP URL。 在循环中,使用 cap.read() 从相机(或视频文件)中连续读取帧。 然后使用 p.stdin.write() 将每个帧写入 ffmpeg 子进程的标准输入。 循环继续,直到读取所有帧或直到发生错误。 最后释放资源并关闭子进程。 根据作业描述中的要求,此代码使用 ffmpeg 有效地将视频帧实时流式传输到指定的 RTMP 端点。如果您还有任何其他问题或需要额外说明,请随时询问!

© www.soinside.com 2019 - 2024. All rights reserved.