在工业项目的背景下,我开发了一个实时应用程序来使用人工智能算法检测人员。在本地,我使用使用框架操作的 OPENCV 获取并显示视频。
目标是实现从Opencv的帧到rtmp服务器的流视频
FFmpeg 似乎是一个不错的视角。然而,通常流是从 .mp4 或几个 .jpg 出发,在 rtmp 服务器上发布流视频。
谢谢你。
首先,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())
该代码使用 OpenCV 的 VideoCapture 函数从相机或视频文件中捕获帧。 然后,它提取帧属性,例如帧速率 (fps)、宽度和高度。 使用 Python 的 subprocess 模块创建子进程,该模块运行 ffmpeg 命令来编码视频帧并将其流式传输到指定的 RTMP URL。 在循环中,使用 cap.read() 从相机(或视频文件)中连续读取帧。 然后使用 p.stdin.write() 将每个帧写入 ffmpeg 子进程的标准输入。 循环继续,直到读取所有帧或直到发生错误。 最后释放资源并关闭子进程。 根据作业描述中的要求,此代码使用 ffmpeg 有效地将视频帧实时流式传输到指定的 RTMP 端点。如果您还有任何其他问题或需要额外说明,请随时询问!