Vueベースのビデオプレーヤーの実装例

Vueベースのビデオプレーヤーの実装例

既存のビデオ プレーヤーがニーズを満たせない場合は、ビデオを自分でカプセル化する必要があります。

ビデオイベント

  • loadstart: ビデオの読み込みが開始されるとトリガーされ、currentTime に値 (履歴再生記録または 0) が割り当てられます。
  • 期間変更: メタ情報が読み込まれたか変更され、ビデオの長さが変更されました。ビデオの長さ (継続時間) を取得し、currentTime に値 (履歴再生記録または 0) を割り当てます。
  • playing: ビデオの再生が開始されたときに発生します (初めて再生する場合、一時停止後に再開する場合、または終了後に再開する場合)。
  • pause: 再生が一時停止されたときにトリガーされます。
  • timeupdate: currentTime が変更されると、再生の進行状況が更新されます。再生プログレスバーの処理
  • seeked: 再生位置を指定します
  • 待機中: バッファ
  • 終了: 再生が終了し、ステータスがリセットされました
  • WeixinJSBridgeReady: WeChat でビデオを使用するには、weixinJSBridgeReady イベントをリッスンし、コールバック関数で play() コマンドを実行する必要があります。

ライブブロードキャストプロトコル

HLS (HTTP Live Streaming) は、Apple が提案したライブ ストリーミング プロトコルです。 iOS と Android の上位バージョンはどちらも HLS をサポートしています。 HLS は主に .m3u8 と .ts の 2 つの再生ファイルで構成されます。 HLS は互換性と拡張性が高いですが、ライブ放送の遅延が発生します。 HLS プロトコルは、ライブ ストリームをダウンロードおよび再生用に小さなセグメントに分割します。リストに 5 つの ts ファイルが含まれており、各 ts ファイルに 5 秒のビデオ コンテンツが含まれていると仮定すると、全体の遅延は 25 秒になります。

RTMP (Real Time Messaging Protocol) は、現在 Adob​​e が所有する Macromedia によって開発されたライブ ビデオ プロトコルのセットです。 RTMP はフラッシュベースであり、iOS ブラウザでは再生できませんが、リアルタイムのパフォーマンスは HLS よりも優れています。

HTTP-FLV は、低遅延の FLV ビデオ形式のライブ配信ストリームです。ただし、モバイルデバイスではサポートされていません。

結論: HTTP-FLV はレイテンシが低いため、推奨されます。デバイスが HTTP-FLV をサポートしていない場合は、flv.js を使用します。デバイスが flv.js をサポートしていない場合は HLS が使用されますが、HLS では遅延が大きくなります。

ビデオをカプセル化する

/** HTML **/
<div class="ビデオ">
 <!-- ビデオ プレーヤー -->
 <ビデオ
  クラス="ビデオ__プレーヤー"
  ref="ビデオプレーヤー"
  プリロード="自動"
  :autoplay="オプション.autoplay"
  :muted="オプション.muted"
  webkit-playsinline="true"
  playsinline="true"
  x-webkit-airplay="許可"
  x5-ビデオプレーヤータイプ="h5-ページ"
  x5-ビデオの向き="縦向き"
  スタイル="object-fit:cover;"
 >
  <ソース:src="options.src" />
 </ビデオ>

 <!-- ビデオポスター -->
 <div
  v-show="ポスターを表示"
  クラス="ビデオ__ポスター"
  :style="{'背景画像': 'url(' + options.pic + ')'}"
 </div>

 <!-- ビデオ読み込み中 -->
 <div v-show="読み込み中" クラス="ビデオ__読み込み中">
  <span class="video__Loading-icon"></span>
 </div>

 <!-- ビデオを一時停止 -->
 <div @click="handleVideoPlay" クラス="video__pause">
  <span v-show="!videoPlay" class="video__pause-icon"></span>
 </div>
</div>
/**js**/
小道具: {
 オプション:
  タイプ: オブジェクト、
  デフォルト: () => {}
 }
},
データ() {
 戻る {
  videoPlay: false, // ビデオは現在再生中か? videoEnd: false, // ビデオは終了しているか? showPoster: true, // ビデオカバーが表示されているか? showLoading: false, // 読み込み中 currentTime: 0, // 現在の再生位置 currentVideo: {
   期間: this.options.duration
  },

 }
},
マウント() {
 this.videoPlayer = this.$refs.videoPlayer;
 this.videoPlayer.currentTime = 0;
 
 this.videoPlayer.addEventListener("loadstart", e => {
   this.videoPlayer.currentTime = (this.options.playProcess > 0) ? this.options.playProcess : 0;
 });
 
  // ビデオの長さを取得します this.videoPlayer.addEventListener("durationchange", e => {
  this.currentVideo.duration = this.videoPlayer.duration;
  // 再生履歴が存在する this.videoPlayer.currentTime = (this.options.playProcess > 0) ? this.options.playProcess : 0;
 });
 
 this.videoPlayer.addEventListener("再生中", e => {
  this.showPoster = false;
  this.videoPlay = true;
  this.showLoading = false;
  this.videoEnd = false;
 });
 
 // 一時停止 this.videoPlayer.addEventListener("pause", () => {
  this.videoPlay = false;
  this.videoPlayer.currentTime が 0.1 未満の場合
   this.showPoster = true;
  }
  this.showLoading = false;
 });
 
 // 再生進行状況の更新 this.videoPlayer.addEventListener("timeupdate", e => {
   this.currentTime = this.videoPlayer.currentTime;
  },
  間違い
 );

 // 再生位置を指定する this.videoPlayer.addEventListener("seeked", e => {
 });

 // バッファリング this.videoPlayer.addEventListener("waiting", e => {
  this.showLoading = true;
 });
 
 // 再生終了 this.videoPlayer.addEventListener("ended", e => {
  // 状態をリセット this.videoPlay = false;
  this.showPoster = true;
  this.videoEnd = true;
  this.currentTime = this.currentVideo.duration;
 });
 
 // WeChat が自動的に再生できない問題を処理するために、weixinJSBridgeReady イベントをリッスンします。ただし、すべてに適用できるわけではありません。手動で再生する場合は一時停止ボタンが追加されます。
 document.addEventListener('WeixinJSBridgeReady', () => { 
  ビデオを再生します。
 }、 間違い);
},
メソッド: {
 ハンドルビデオ再生() {
  if (this.videoPlayer.paused) { // 再生 if (this.videoEnd) { // 再再生 this.currentTime = 0;
    this.videoPlayer.currentTime = 0;
   }
   ビデオを再生します。
   this.videoPlay = true;
  } else { // 一時停止 this.videoPlayer.pause();
   this.videoPlay = false;
  }
 }
}

[参考記事]:

  • X5コアビデオ2つの再生モード
  • H5 ライブビデオラベルの落とし穴のまとめ
  • H5 ライブ放送入門(理論)
  • 総合的な高度なH5ライブ放送

vueベースのビデオプレーヤーの実装例に関するこの記事はこれで終わりです。より関連性の高いvueビデオプレーヤーのコンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue の Vue-Video-Player 操作
  • vue-video-player ビデオプレーヤーの詳細設定
  • vue-video-player をベースにしたプレーヤーのカスタマイズ方法

<<:  Centos7 で keepalived ログを別のパスに設定する方法の詳細な説明

>>:  mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

推薦する

Linux 上での MySQL データベースのリモート展開の詳細な手順

LinuxリモートMySQLデータベースの展開、参考までに、具体的な内容は次のとおりです。 1.0 ...

ノードイベントループにおけるイベント実行の順序

目次イベントループブラウザ環境イベントループノード環境イベントループ6つのステージ(1)setTim...

Docker で TLS と CA 認証を有効にする方法

目次1. 証明書を生成する2. リモートを有効にする3. リモート接続3.1 Jenkins接続3....

win2008 で mysql8.0.11 を mysql8.0.17 にアップグレードする詳細な手順

アップグレードの背景: MySQLの下位バージョンの脆弱性を解決するために、MySQLはMySQL ...

uni-app で scss を使用するサンプル コード

遭遇した落とし穴私は午後中ずっと、uni-app で scss を使用する際の落とし穴を解決すること...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

MySQL のストアド プロシージャを使用して 100 万件のレコードをすばやく生成する方法

序文テストを行う際、大量のデータによる負荷に耐えるプロジェクトの能力をテストするために、通常はテスト...

lnmp を使用して MySQL データベースのルート パスワードをリセットする 2 つの方法

最初の方法: Junge のワンクリック スクリプトを使用して、LNMP 環境で MYSQL データ...

MySQL エラー番号 1129 の解決方法

SQLyog が MySQL に接続する際にエラー番号 1129 が発生します: mysql エラー...

モバイル端末の適応に関する簡単な説明

序文フロントエンド コードの記述では、「互換性」という言葉から逃れることはできません。過去の PC ...

LAMP ソースコードを使用したエンタープライズレベルのインストールチュートリアル

目次LAMPアーキテクチャ1.ランプの紹介2. WebサービスワークフローWebサーバーのリソースは...

OCSP を有効にすると、https 証明書の検証効率が向上し、Let's Encrypt SSL 証明書へのアクセスが遅くなる問題が解決されます。

ここ数日、ウェブサイトを初めて開いたときにアクセスが非常に遅いのですが、その後はページが正常に開きま...

HTML の doctype とエンコーディングに関する簡単な説明

文書タイプDoctype は、指示を解析するためにどのバージョンの HTML を使用するかをブラウザ...

Linux Dig コマンドの使用法

発掘紹介: Dig は、Unix ライクなコマンドライン モードで NS レコード、A レコード、M...

Web ベースの電子メール コンテンツの HTML フォーマット標準の概要

1. ページ要件1) 標準のヘッダーとフッターを使用するXML/HTML コードコンテンツをクリップ...