浏览器取消HLS流,而VLC接受它

时间:2016-07-16 22:20:43

标签: python video-streaming http-live-streaming m3u8 aiohttp

我通过将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的更多信息,我发送信息:

视频信息VLC

Video Informations VLC

直接视频流HTTP响应(开始)

Direct Video Stream HTTP Response

M3U播放列表HTTP响应

M3U Playlist HTTP Response

1 个答案:

答案 0 :(得分:1)

我没有亲自体验HLS的经验,但是对RFC draft显示器的大量概述你违反了协议。

这不是关于在单个无限响应中一起发送视频块,而是关于通过keep-alive用法使用相同的套接字连接发送多个http响应。

客户端发送新数据部分的请求,提供特定于协议的EXT*标志,服务器应该正确响应。在最初客户端要求播放列表时,服务器应该回答正确的数据。

通信协议很复杂,抱歉。 我不能只在你的代码片段中修改几行来使其正常工作。