我通过将MPEG-TS流内容写入GridFS文件系统来记录HSL流。
我现在正试图使用aiohttp
s SessionResponse
将此内容重新发送回浏览器,但由于各种原因而失败。
async def get_video(request):
stream_response = StreamResponse()
stream_response.headers['Content-Type'] = 'video/mp2t'
stream_response.headers['Cache-Control'] = 'no-cache'
stream_response.headers['Connection'] = 'keep-alive'
await stream_response.prepare(request)
fd = GridFS()
video_stream = await fd(video_id)
while True:
try:
chunk = await video_stream.readchunk()
if not chunk:
break
stream_response.write(chunk)
except CancelledError as e:
# fails here in safari or with diff content-type also in chrome
break
await stream_response.write_eof()
return stream_response
当尝试使用safari访问网址时,我会显示播放器ui,但是当服务器抛出CancelledError
异常试图写入已经关闭的SessionResponse
在Chrome中打开网址会导致下载视频文件。此文件在VLC中播放时有效。甚至使用"网络源"在VLC内播放URL的工作原理。
我也试过在这个直接网址前面提供一个静态m3u播放列表,但没有运气(VLC也可以使用直播流的播放列表):
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="medium",NAME="Medium",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=992000,RESOLUTION=852x480,CODECS="avc1.66.31,mp4a.40.2",VIDEO="medium"
http://localhost:8080/videos/{video_id}
我不确定如何进一步调试这一点,并希望得到任何帮助(或在评论中询问我是否不清楚)。我错过了哪些文件直接访问时无法在浏览器中播放?将我的资源网址嵌入到html视频代码中也没有用(显然,因为浏览器在直接访问视频时也会这样做)
有关视频内容和原始http的更多信息,我发送信息:
答案 0 :(得分:1)
我没有亲自体验HLS的经验,但是对RFC draft显示器的大量概述你违反了协议。
这不是关于在单个无限响应中一起发送视频块,而是关于通过keep-alive用法使用相同的套接字连接发送多个http响应。
客户端发送新数据部分的请求,提供特定于协议的EXT*
标志,服务器应该正确响应。在最初客户端要求播放列表时,服务器应该回答正确的数据。
通信协议很复杂,抱歉。 我不能只在你的代码片段中修改几行来使其正常工作。