python - FFmpeg 将视频从帧 OpenCV python 流式传输到 rtmp
问题描述
在工业项目的背景下,我开发了一个实时应用程序来使用 AI 算法检测人。在本地,我获取并显示使用 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())
推荐阅读
- wpf - 使用文本大小放大单选按钮和复选框项目符号绑定
- r - r - 将 filter() 应用于 data.frame 的难度
- asp.net - 如何使用asp.net和angularJS将文件Excel导入数据库中的多个表?
- riscv - 如何监测火箭芯的性能?
- hadoop - 如何在 Yarn Web UI 中启用“终止应用程序”按钮
- javascript - array.reduce 中的 Math.max 或 sum 在性能方面更好
- scala - 获取broadcast_22的broadcast_22_piece0失败
- laravel - 获取服务器的所有 GET 请求,或一些 Laravel GET 请求日志?
- python - 如何让 Bottle 拒绝过大的上传文件?
- android - 如何从颤振插件本机代码返回小部件?