首页 > 解决方案 > 在多个设备上的 Flask 应用程序上提供视频时缓冲

问题描述

我创建了一个通过 Flask 应用程序提供两个视频的网站原型。我目前正在烧瓶的开发服务器中测试它们,但是在为超过 3 个设备提供服务时我面临缓冲问题(有时也有 3 个,但缓冲区大小的变化修复了它)。这是我的代码的样子:


def partial_response(path, start, end=None):
    file_size = os.path.getsize(path)
    if(end is None):
        end = start + BUFF_SIZE - 1
    end = min(end, file_size)
    end = min(end, start + BUFF_SIZE - 1)
    length = end - start + 1

    #read file
    with open(path, 'rb') as video_file:
        video_file.seek(start)
        bytes = video_file.read(length)

    response = Response(
        bytes, 
        206, 
        mimetype=mimetypes.guess_type(path)[0],
        direct_passthrough=True
        )

    response.headers.add(
        'Content-Range', 'bytes {0}-{1}/{2}'.format(start, end, file_size)
    )

    response.headers.add(
        'Accept-Ranges', 'bytes'
    )

    return response

def get_range(req):
    range = req.headers.get('Range')
    print(range)
    m = re.match('bytes=(?P<start>\d+)-(?P<end>\d+)?', range)
    if(m):
        start = int(m.group('start'))
        end = m.group('end')
        if end is not None: 
            end = int(end)
        return [start, end]
    else:
        return [0, None]

@app.route("/two.mp4")
def two():
    return render_template('watch_video.html', video_name="two.mp4")

@app.route("/static/videos/two.mp4")
def two_video():
    start, end = get_range(request)
    print(start, end)
    return partial_response("p<ath to two.mp4>", start, end)

if(__name__ == "__main__"):
    app.run(host='0.0.0.0')

缓冲可能是由于:

  1. 烧瓶及其阻塞API?
  2. 缓冲区大小?
  3. 主机的资源容量?
  4. 路由器限制?
  5. 只是糟糕的代码?

或者可能是别的什么?我需要一些指导。

预期设备数量:10
测试设备数量:5
测试视频大小:1GB

标签: pythonpython-3.xflaskhtml5-video

解决方案


推荐阅读