videoタグによるストリーミング読み込みのhtml5実装
ビデオタグ
ブラウザの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形式のファイルに変換しています。
という利点があります。
- は、クロームがhls形式(その他様々な非対応形式)をサポートしていない問題を解決します。バイナリビデオデータを直接操作しているので、サポートされていないビデオタグは存在しないのです。
- リフレッシュビデオに定義が切り替わる問題を解決しました。 {を使用します。 mp4ファイルの早送り操作のリクエスト読み込みを最小限に抑え、ストリーミング読み込みに対応できるようにしました。
- ライブストリーミングとポップアップのサポート
動画のストリームを直接操作しているので、動画の定義を切り替えたり、早送りをする際には、ストリームの現在時刻を後計算して、新しいストリームの動画をjsで読み込み、最速の読み込みと反応を実現しています。
今回はhtml5 with video tag stream loadingの実装についてご紹介しましたが、より関連するhtml5 with video tag stream loadingのコンテンツはスクリプトハウスの過去記事を検索するか、以下の関連記事を引き続きご覧ください、今後ともスクリプトハウスをよろしくお願いします。
関連
-
サンプルレートとビットレートを設定してmp3オーディオを録音するhtml5
-
HTML5 ドラッグ&ドロップによるファイルアップロードのサンプルコード
-
html5 applet fly into the shopping cart (放物線描画モーショントラック・ポイント)
-
ウェブサイトパフォーマンスのための画像読み込みを遅らせる5つのコツ(要約)
-
リフレッシュせずにURLを変更するHTML5メソッド
-
AmazeUIのダウンロード設定とHelloworldの実装について
-
html5でBUI折りたたみメニュープラグインを書く方法
-
カスタムお絵かきボード用JavaScript+Canvasサンプルコード
-
html2canvas.jsを使用してページのスクリーンショットを撮影し、表示またはアップロードするサンプルコード
-
html5のfigureとfigcaptionの使い方
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン