Vueはビデオ再生を実装するためにビデオタグを使用します

Vueはビデオ再生を実装するためにビデオタグを使用します

この記事では、ビデオタグを使用してビデオ再生を実装するVueの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

プロジェクト要件:ビデオのスクロール バーを動的に表示し、ビデオのダウンロードを禁止し、再生中に 5 秒ごとに現在の継続時間を更新し、10 分ごとにビデオを一時停止してプロンプトを表示します。
これまで、動画を再生する場合、完全なカプセル化機能と優れた再生ソース互換性を備えているため、基本的に vue-video-player コンポーネントが使用されていました。
このプロジェクトの要件を通じて、ビデオ タグの特性と方法についても詳しく研究しました。ここで詳細をお伝えします。

具体的な使い方は以下のとおりです

<テンプレート>
  <!-- ビデオ コンポーネント -->
  <div id="common-video" class="h-100">
    <div:class="{isShow:control}" class="h-100">
      <ビデオ
        ref="私のビデオ"
        :poster="ポスター"
        :src="src"
        :controls="コントロール"
        oncontextmenu="false を返す"
        @timeupdate="時間更新"
        コントロールリスト="nodownload"
        クラス="ビデオボックス"
      </ビデオ>
      <画像
        src="@/assets/images/playbtn.png"
        代替案=""
        @click="ビデオを操作する"
        class="ポインタ操作ボタン"
        :class="{ 'フェードアウト': videoState }"
      />
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: "CommonVideo",
  データ() {
    戻る {
      videoState: false, // ビデオ再生ステータス // 学習時間 studyTime: {
        currentTime: 0, // 現在の学習時間 期間: 0 // 合計時間},
      timer: {}, // タイマー pauseTimer: {} // タイマーを一時停止 };
  },
  /**
   * @param ポスター表示画像* @param src ビデオリソース* @param controls コントロールを表示するかどうか* @param control コントロール* @param videoData 基本ビデオデータ*/
  小道具: {
    ポスター:
      タイプ: 文字列、
      必須: false、
      デフォルト: ""
    },
    ソース: {
      タイプ: 文字列、
      必須: true
    },
    コントロール: {
      タイプ: ブール値、
      必須: false、
      デフォルト: true
    },
    コントロール: {
      タイプ: ブール値、
      必須: false、
      デフォルト: false
    },
    ビデオデータ: {
      タイプ: オブジェクト、
      必須: true
    }
  },
  マウント() {
    // ビデオの再生をリッスンします this.$refs.myVideo.addEventListener("play", () => {
      console.log("ビデオが再生中です");
      タイマーをオープンします。
    });
    // ビデオの一時停止をリッスンします。this.$refs.myVideo.addEventListener("pause", () => {
      console.log("ビデオが停止しました");
      this.closeTimer();
    });
  },
  メソッド: {
    // タイマーを開く openTimer() {
      this.timer = setInterval(() => {
        this.$emit("videoStudyTime", this.studyTime);
      }, 5000);
    },
    // タイマーを閉じる closeTimer() {
      タイマー間隔をクリアします。
      this.$emit("videoStudyTime", this.studyTime);
    },
    // 一時停止タイマーを開く openPauseTimer() {
      this.pauseTimer = setInterval(() => {
        this.hintOperate();
      }, 600000);
    },
    // 一時停止タイマーを閉じる closePauseTimer() {
      間隔をクリアします(this.pauseTimer);
    },
    // ヒント操作 hintOperate() {
      this.operateVideo();
      this.$alert("確認して学習を続けるにはクリックしてください", "プロンプト", {
        confirmButtonText: "確認",
        確認ボタンクラス: "ヒントボタン"、
        表示閉じる: false,
        コールバック: アクション => {
          this.$refs.myVideo.currentTime = this.videoData.currentTime;
          ビデオを操作する
          this.openPauseTimer();
        }
      });
    },
    // 現在の再生位置を取得する timeupdate(e) {
      this.studyTime.currentTime = e.target.currentTime;
      this.studyTime.duration = e.target.duration ? e.target.duration : 0;
    },
    // ビデオの再生と一時停止を操作するoperateVideo() {
      (!this.src)の場合{
        this.$message({ message: "ビデオリソースがありません。他のビデオを確認してください!" });
        false を返します。
      }
      (this.$refs.myVideo.paused)の場合{
        this.$refs.myVideo.play();
        this.videoState は true です。
      } それ以外 {
        this.$refs.myVideo.pause();
        this.videoState = false;
      }
    }
  },
  時計:
    //監視操作 videoData(val, oldVal) {
      const { currentTime, 継続時間 } = val;
      現在の時刻 && 継続時間 && 現在の時刻 < 継続時間) {
        this.hintOperate();
      }
    }
  }
};
</スクリプト>

<スタイル lang="less">
#共通ビデオ{
  位置: 相対的;
  .ビデオボックス{
    ボックスのサイズ: 境界線ボックス;
    境界線: 0;
    表示: ブロック;
    幅: 100%;
    高さ: 100%;
    アウトライン: なし !important;
  }
  .isShow{
    // 進行状況バー video::-webkit-media-controls-timeline {
      表示: なし;
    }
  }
  ビデオ::-webkit-media-controls-再生ボタン {
    可視性: 非表示;
  }
  .操作ボタン{
    表示: ブロック;
    幅: 60ピクセル;
    高さ: 60px;
    位置: 絶対;
    上: calc(50% - 30px);
    左: calc(50% - 30px);
  }
  .operate-btn:hover {
    不透明度: 0.8;
  }
  .フェードアウト{
    不透明度: 0;
  }
}
</スタイル>

注記:

1. CSSスタイルのisShow属性を使用して、ビデオのスクロールバーを動的に表示する
2. ビデオタグのoncοntextmenu="return false"属性を使用してダウンロードを禁止する
3. ビデオタグの@timeupdate="timeupdate"メソッドを使用して、ビデオ再生の進行状況を監視します。
4. vue の ref 属性を使用して監視イベントをビデオ タグにバインドし、期間の統計、遅延プロンプト、アイコン再生ボタンの動的表示などの他の機能を実装します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vue ビデオ再生用の vue-video-player プラグインの使用方法
  • Vueはビデオ再生にvideo.jsを使用します
  • Vue と Video.js を組み合わせて m3u8 ビデオ ストリームを再生する方法の例
  • Vue ビデオ再生一時停止コード
  • vue-video-player ビデオプレーヤーの詳細設定
  • vue + typescript + video.js でストリーミングビデオ監視機能を実現
  • vue video.js で m3u8 ビデオ再生形式を解決する方法
  • vue-dplayer ビデオ プレーヤーのサンプル コード
  • Vue+video.jsはビデオプレイリストを実装します
  • Vue で h5 ビデオ タグを使用してポップアップ ウィンドウでローカル ビデオを再生する方法

<<:  MySQL 最適化チュートリアル: 大規模なページングクエリ

>>:  静的リソースファイルのアクセスログをフィルタリングするNginxの実装

推薦する

記事では、js を使用して弾幕効果を実現する方法を説明します

目次新しい HTML ファイルを作成します。初期テンプレートを作成するHTML の追加CSS パディ...

MySQLはgroup_concat()関数に基づいて複数のデータ行を結合します

非常に便利な機能group_concat() について、マニュアルには次のように記載されています: ...

スクロールバーを非表示にしながらもスクロール効果を維持する純粋な CSS (モバイルと PC)

携帯モバイル ページは Chrome および Safari とのみ互換性があればよいため、カスタム ...

IdeaでMySQLデータベースに接続すると中国語の文字化けが発生する問題

問題: JDBCを使用してMySQLデータベースに接続すると、中国語の文字を挿入すると文字化けした文...

10分でDockerを使ったマイクロサービスのデプロイ方法を学ぶ

Docker は 2013 年のリリース以来、広く注目され、ソフトウェア業界を変える可能性を秘めてい...

Apache ab同時負荷ストレステストの実装方法

腹筋コマンドの原則Apache の ab コマンドは、マルチスレッドの同時リクエストをシミュレートし...

JavaScriptのスタックとコピーの詳細な説明

目次1. スタックの定義2. JSスタックの調査1. スタックとヒープ2. 基本型と参照型3. 値渡...

MySQL の悲観的ロックと楽観的ロックの使用例

悲観的ロック悲観的ロックは、データを悲観的であるとみなします。データをクエリするときに、ロックを追加...

Linuxがすべてのコマンドをサポートしていない問題の解決策

Linux がすべてのコマンドをサポートしていない場合はどうすればいいですか?すべてのLinuxコマ...

MySQL Shellの紹介とインストール

目次01 レプリ​​カセットアーキテクチャ02 MySQL Shellの紹介とインストール03 My...

mysqlサーバーは--skip-grant-tablesオプションで実行されています

MySQLサーバーは--skip-grant-tablesオプションで実行されているため、このステー...

HTML から PDF への変換事例の概要 (複数の画像を推奨)

仕事の都合上、最近 HTML を PDF に変換する機能について調べることに時間を費やしました。 H...

WEB2.0の片手ルール

<br />前回のCSSに関する記事は、多くの人にあまり理解されませんでした。そのため、...

Vue Nativeを使用したモバイルアプリケーションの構築プロセスの完全な記録

目次序文Vue Nativeの機能宣言的レンダリング双方向バインディングVue.js エコシステムの...

node.js の require メソッドの読み込みルールの詳細な説明

require メソッドの読み込みルールキャッシュからの読み込みを優先するコアモジュールパス形式のモ...