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
サファリを使用して URL にアクセスしようとすると、プレーヤーの UI が表示されますが、サーバーがCancelledError
既に閉じられているものに書き込もうとして例外をスローしている間は何も再生されません。SessionResponse
URL を Chrome で開くと、動画ファイルがダウンロードされます。このファイルは VLC で再生するときに機能します。「Network Source」を使用して VLC 内で URL を再生しても機能します。
また、このようなダイレクト 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}
これをさらにデバッグする方法がわからないので、助けていただければ幸いです(または、不明な場合はコメントでお尋ねください)。ファイルに直接アクセスすると、ファイルがブラウザで再生されないというのは何が欠けていますか? また、リソース URL を html ビデオ タグに埋め込んでも役に立ちませんでした (明らかに、ブラウザはビデオに直接アクセスするときに同じことを行うため)。
ビデオ コンテンツと私が送信している生の HTTP 応答に関する詳細情報: