python - 使用 FFMPEG 和 FFSERVER 流式传输视频

标签 python opencv ffmpeg ffserver

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


3年前关闭。







Improve this question




我正在使用一个简单的 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 发送任何内容。

我正在使用 this blog post 中的代码

最佳答案

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()

关于python - 使用 FFMPEG 和 FFSERVER 流式传输视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52530563/

相关文章:

ios - 如何从 Objective-C 调用 C 函数

python - 从系列中创建一个 Pandas DataFrame 而不重复它们的名称?

opencv - warpPerspective 和 warpAffine 不适用于大图像,高度>32k

opencv - CvSVM.predict() 给出 'NaN' 输出和低精度

c++ - 如何在按比例缩小的图像中找到等效点?

ffmpeg如何允许文件扩展名

go - golang中的FFmpeg I-P帧命令

python - 需要刷新 Python 多处理队列

python - 使用 text.usetex 时无法将 matplotlib 图保存到 Windows 中的 .eps : True

python - 在pygtk中添加翻译文件