0

MPEG-TS ストリームのコンテンツを GridFS ファイルシステムに書き込むことで、HSL ストリームを記録しました。

私は現在、さまざまな理由で失敗するaiohttpsを使用して、このコンテンツをブラウザに提供しようとしています。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 応答に関する詳細情報:

ビデオ情報 VLC

ビデオ情報 VLC

ダイレクト ビデオ ストリーム HTTP 応答 (開始)

ダイレクト ビデオ ストリーム HTTP レスポンス

M3U プレイリスト HTTP レスポンス

M3U プレイリスト HTTP レスポンス

4

1 に答える 1

1

私は個人的に HLS の経験はありませんが、RFC ドラフトの広範な概要でさえ、プロトコルを破っていることがわかります。

ビデオチャンクを単一のエンドレス応答で一緒に送信することではなく、キープアライブを使用して同じソケット接続を利用して複数の http 応答を送信することです。

クライアントは、プロトコル固有のEXT*フラグを提供する新しいデータ部分の要求を送信し、サーバーは適切に応答する必要があります。クライアントがプレイリストを要求する最初の段階で、サーバーは適切なデータで応答する必要があります。

通信プロトコルはかなり複雑です。申し訳ありません。スニペットの数行を修正して機能させることはできません。

于 2016-07-17T16:11:19.787 に答える