1. ホーム
  2. Web制作
  3. html5

videoタグによるストリーミング読み込みのhtml5実装

2022-01-13 20:40:23

ビデオタグ

ブラウザのvideoタグは通常src属性を受け取り、そのsrc属性に基づいてブラウザが自動的に動画を読み込む。
この処理は、ブラウザが動画を読み込む際に行われます。

この方法に問題はないのでしょうか?

  • mp4ファイルをストリーミングで読み込むことができない
  • Webm、flv、hls およびその他のフォーマットの互換性の問題
  • {について プレーヤーUIが醜すぎる、いくつかの一般的な機能が使えない {を使用します。 クラリティの切り替えなど、一部の操作で動画の再読み込みが必要なため、動作が重く、画面も真っ黒になる {を使用します。 映像の暗号化ができない

リクエスト動画 ストリーミング動画

responseType に arraybuffer を指定することで、ビデオストリームを取得することができます。また、range フィールドを使用することで、ビデオストリームのクリップを取得することも可能です。例えば

let xhr = new window.XMLHttpRequest();
xhr.responseType = 'arraybuffer'
xhr.open('get', 'http://www.w3school.com.cn/i/movie.mp4')
xhr.responseType = 'arraybuffer';
// xhr.setRequestHeader('Range', `bytes=0-390625`)
xhr.onload = function () {
    if (xhr.status === 200 || xhr.status === 206) {
        console.log(xhr.response)
    }
}
xhr.send();

または、fetchのarrayBufferメソッドがビデオストリームを返します。

 fetch(videoUrl).then(function(response) {
       return response.arrayBuffer();
 })

取得したデータは何ですか?バイナリビデオストリームです。
こんなの貰ってどうすんの?

動画は "ストリーム "へ

メディアソース

MediaSourceはmseと略され、jsで生成したメディアストリーミングをブラウザで再生できるh5のapiです。

を使用します。

URL.createObjectURL を介して video タグに流す blob 形式の動画ファイルを作成します。
具体的な使い方としては、MediaSourceを新規に作成し、このMediaSourceを元にblobファイルを生成し、MimeとvideoのストリームをMediaSourceに追加しています。

<div class="a">
        <video id="video" controls preload="auto"></video>
    </div>
    <script>
        $(function() {
            var video = document.querySelector('#video');
            var mediaSource = new MediaSource();
            video.src = URL.createObjectURL(mediaSource);
            mediaSource.addEventListener('sourceopen', sourceOpen);

            function sourceOpen(e) {
                URL.revokeObjectURL(video.src);
                // Set the encoding type of the media
                var mime = 'video/webm; codecs="vorbis,vp8"';
                var mediaSource = e.target;
                var sourceBuffer = mediaSource.addSourceBuffer(mime);
                var videoUrl = 'http://localhost:9090/examples/mp4/video.webm';
                fetch(videoUrl).then(function(response) {
                        console.log(response)
                        return response.arrayBuffer();
                    })
                    .then(function(arrayBuffer) {
                        sourceBuffer.addEventListener('updateend', function(e) {
                            if (!sourceBuffer.updating && mediaSource.readyState === 'open') {
                                mediaSource.endOfStream();
                                // After the data request is done, we need to call endOfStream(). It will change MediaSource.readyState to ended and trigger the sourceended event.
                                video.play().then(function() {}).catch(function(err) {
                                    console.log(err)
                                });
                            }
                        });
                        sourceBuffer.appendBuffer(arrayBuffer);
                    });
            }
        })
</script>

私たちの地雷とは?
video/webmはビデオフォーマットで、コーデックの後の最初の段落はビデオコーデックに関する重要な情報、例えばエンコード方法、解像度、フレームレート、ビットレート、デコーダーのデコード能力に対する要求事項などです。
第2段落は、音声部分に関する情報です。

画像

このようにvideoタグを生成します。これで、ブラウザが直接リクエスト src に行くステップを回避し、ajax で動画ストリームをリクエストし、動画ストリームを処理して直接操作することで、必要なさまざまな機能を実現できます。
しかし、mp4形式の場合、ストリーミング読み込みに対応していないので、自分でストリームを操作することでしかストリーミングを実現できないのです。

プレイヤー

会社の同僚が、オープンソースのプレーヤーを開発しました。 https://github.com/bytedance , スイカのビデオ良い数千万ダウの製品の実地テスト。

プレイヤー主義

ストリーミングを使って映像ソースを処理しており、単にストリームをリクエストしてvideoタグに渡して再生するのではなく、映像ストリームをリクエストしてjsでデコードし、必要な処理をした上でvideoに渡して再生しています。

なぜjsでデコードする必要があるのですか?

会社の動画のほとんどがmp4なのですが、mp4をストリーミング再生に対応させるにはどうしたらいいのでしょうか?mp4のストリームを受け取り、jsがそのビデオ情報を解析し、jsがビデオストリーミングをサポートするfmp4形式のファイルに変換しています。
という利点があります。

  1. は、クロームがhls形式(その他様々な非対応形式)をサポートしていない問題を解決します。バイナリビデオデータを直接操作しているので、サポートされていないビデオタグは存在しないのです。
  2. リフレッシュビデオに定義が切り替わる問題を解決しました。
  3. {を使用します。 mp4ファイルの早送り操作のリクエスト読み込みを最小限に抑え、ストリーミング読み込みに対応できるようにしました。
  4. ライブストリーミングとポップアップのサポート

動画のストリームを直接操作しているので、動画の定義を切り替えたり、早送りをする際には、ストリームの現在時刻を後計算して、新しいストリームの動画をjsで読み込み、最速の読み込みと反応を実現しています。

今回はhtml5 with video tag stream loadingの実装についてご紹介しましたが、より関連するhtml5 with video tag stream loadingのコンテンツはスクリプトハウスの過去記事を検索するか、以下の関連記事を引き続きご覧ください、今後ともスクリプトハウスをよろしくお願いします。