python - 使用 FFMPEG 和 FFSERVER 流式传输视频
问题描述
我正在使用一个简单的 opencv 代码从系统中读取视频文件。
import cv2
cap = cv2.VideoCapture("1.mp4")
while True:
res,frame = cap.imread()
cv2.imshow("frame",frame)
cv2.waitKey(1)
现在我想将此视频源流式传输到 HTTP 服务器,以便多个用户可以使用给定的 URL 访问它。
我遇到了 Flask,但它一次只支持一个用户。
在浏览了各种博客之后,我知道 FFSERVER 和 FFMPEG 可能会解决这个问题。现在我被困在如何向 FFSERVER 发送帧。我运行以下命令..
ffmpeg -i sintel.mp4 http://localhost:8090/feed1.ffm
但我没有向 FFSERVER 发送任何内容。
我正在使用这篇博文中的代码
解决方案
Flask通常以单线程模式运行,一次只能处理一个请求,这意味着任何并行请求都应该等待,直到它们可以被处理。
为了解决这个问题,您只需要threaded=True
输入您的脚本,这将导致您的应用程序在不同的线程上处理每个请求。
我在下面的两个示例 Python 脚本中附加了应该完成这项工作的示例:
主文件
# main.py
from flask import Flask, render_template, Response
from camera import VideoCamera
app = Flask("AppName")
@app.route('/')
def index():
return render_template('index.html')
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host ="0.0.0.0", port=33, threaded=True)
相机.py
# camera.py
import numpy as np
import cv2
import time
class VideoCamera(object):
def __init__(self):
self.video = cv2.VideoCapture("yourVideo.mp4")
def __del__(self):
self.video.release()
def get_frame(self):
success, image = self.video.read()
# Image readed by OpenCV is RAW
# we encode it to JPEG in order to use Motion JPEG for VideoStream after
ret, jpeg = cv2.imencode('.jpg', image)
return jpeg.tobytes()
推荐阅读
- r - 如何在R中的一天开始时为包含唯一值的空行分配值?
- reactjs - 在 React 中渲染 iFrame
- linux - 为什么crontab:即使文件夹存在并且具有777权限,也不是这样的文件或目录?
- javascript - Javascript 对象 - call() 方法
- java - 选项卡或浏览器关闭时的 Spring Boot 会话
- rust - 将 &[u8] 推送到 Vec 时的借用/范围问题
- windows - 获取本地用户对象并将它们与已知的良好字符串进行比较?
- c# - C# WPF 按钮用鼠标移动
- api - 在 Flutter 中使用 SOAP Web 服务示例
- php - .htaccess url 重写以从 url 中删除操作名称