使用Flask提供.mp4文件并在ObjectiveC应用程序上播放会导致管道破裂,无法播放

2024-09-27 23:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在iOS应用程序上播放由FlaskWeb应用程序提供服务的视频。虽然我可以播放“传统”web服务器(如Apache)提供的任何视频,但不能播放Flask提供的视频。以下是相关代码:

目标C

NSURL *videoURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@",videourltemp]];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];

playerViewController.player = player;
[self.view addSubview:playerViewController.view];
[self.navigationController pushViewController:playerViewController animated:YES];

Python

^{pr2}$

旁注:如果我试图从浏览器访问我的网址,视频是正确加载。在

我怎样才能解决我的问题?在

提前谢谢你!在


Tags: self服务器viewweb应用程序视频apache传统
2条回答

你有两个选择:

  1. 打开文件并分块读取,而不是像在代码中那样将其作为单个blob读取。以下示例来自:https://stackoverflow.com/a/24318158/1955346

    from flask import stream_with_context, Response
    
    @app.route('/stream_data')
    def stream_data():
        def generate():
            with open("/root/media_assets/" + file["path"], "rb") as f:
                while True:
                    chunk = ... # read each chunk or break if EOF
                    yield chunk
    
        return Response(stream_with_context(generate()), mimetype="video/mp4")
    
  2. 使用来自How do I stream a file using werkzeug?的直接方法: return Response(file("/root/media_assets/" + file["path"]), direct_passthrough=True)

我遇到了同样的问题,最终发现真正的问题是视频播放器客户端(至少在Objective-C iOS中)在响应中使用了“range”头(您可以打印出Flaskrequest.headers进行检查)。换句话说,流媒体实际上是通过HTTP中的“range”支持来实现的。在

我遵循了https://codeburst.io/the-taste-of-media-streaming-with-flask-cdce35908a50中的示例,Flask服务器代码需要使用“部分内容”(HTTP状态代码206)构建响应,并需要处理请求中的“range”头。相关代码如下:

  1. 在请求后在Flask app中添加“Accept Ranges”,以便客户端知道“range”是受支持的:
@app.after_request
def after_request(response):
    response.headers.add('Accept-Ranges', 'bytes')
    return response
  1. 在服务mp4文件的函数中,假设文件路径是“full-path”:
^{pr2}$

在我的测试中,上面的Flask代码可以与iOS objective-C客户端以及Chrome、Firefox浏览器中的.mp4文件一起使用。在

相关问题 更多 >

    热门问题