使用FFMPEG和FFSERVER播放视频流

时间:2018-09-27 06:15:57

标签: python opencv 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。

我正在使用this blog post

中的代码

1 个答案:

答案 0 :(得分:1)

烧瓶通常以单线程模式运行,并且一次只能处理一个请求,这意味着任何并行请求都应等待,直到可以处理为止。

为了解决此问题,您只需要在脚本中放入threaded=True,这将导致您的应用程序在不同的线程上处理每个请求。

我在这里附上以下两个示例Python脚本,它们应该可以完成这项工作:

main.py

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

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