【发布时间】:2016-01-17 11:18:58
【问题描述】:
我正在使用 Python2.7、django==1.7 和 uwsgi 将视频/mp4 文件流式传输到 iPhone 播放器。
我的代码如下:
def stream(request):
with open('/path/video.mp4', 'r') as video_file:
response = HttpResponse(video_file.read(), content_type='video/mp4')
response['Content-Disposition'] = 'inline; filename=%s' % 'video.mp4'
return response
video_file.close
当我使用一些小视频(小于 1MB)时,它会在浏览器中流式传输,但在 iPhone palyer 中出现此错误:
[uwsgi-http 密钥:127.0.0.1:8008 client_addr:192.168.0.172 client_port: 14563] hr_write(): 损坏的管道 [plugins/http/http.c 行 564]
当视频大小超过 5MB 时,它不会在两个(意味着浏览器和 iPhone 播放器)中流式传输,并出现相同的错误。
我尝试通过使用 StreamHttpRespose 返回的块块来做到这一点,如下所示:
def read(chunksize=8192):
with open('/path/video.mp4', 'rb') as video_file:
byte = video_file.read(chunksize)
while byte:
yield byte
return StreamingHttpResponse(read(), content_type='video/mp4')
但是有同样的错误:Broken pipe。
仅供参考,我可以流式传输 pdf 和图像文件。此问题仅与 mp4 文件有关。而且我将 content_type 更改为“video-mpeg”,浏览器下载了它,而我想阻止文件下载。
你的想法是什么?有什么解决办法!!?
【问题讨论】:
-
为了流式传输,您需要另一个线程将数据写入响应。因为你这样做的方式很简单,直到你读完整个文件并一起发送。
-
@BogdanIulianBursuc 感谢您的评论,但在第二个解决方案(StreamHttpResponse)中,我将视频文件作为字节读取并通过 yield 命令在每个块中返回。这意味着它不需要等待获取整个文件。
-
嗨,Aida,我很想知道您是否找到了有关此主题的任何解决方案。我也有同样的问题:)谢谢
-
@Charlie,我向你解释了我为此做了什么。但这不是解决方案,只是它可以正常工作。如果您找到任何解决方案,请回答我的问题并获得您的分数;)
-
感谢@Aida.Mirabadi!
标签: django python-2.7 video video-streaming uwsgi