LoginSignup
66
57

More than 3 years have passed since last update.

JavaScriptで動画再生を操作する

Last updated at Posted at 2019-12-24

動画の設置

<video> 要素の記述

htmlの基本的な記述は以下の通り。
<video>要素のsrc属性で動画のパスを指定します。動画再生に非対応の古いブラウザ用に、代替テキストや画像を用意するとよいと言われています。その場合は、<video>要素内に記述します。

index.html
<video src="./hoge.mp4">
  <p>ご使用のブラウザでは動画再生に対応していません</p>
</video>

HTML5以降では、<video>要素内に<source>要素を記述し、複数のソースを指定することが可能です。その場合は、上から順に<source>をみていき、再生可能なものが利用されます。

index.html
<video>
  <source src="./hoge.mp4" type="video/mp4">
  <source src="./hoge.webm" type="video/webm">
 <p>ご使用のブラウザでは動画再生に対応していません</p>
</video>

<video> 要素に指定できる属性

<video> 要素のcontrols属性を使用することで、ブラウザに用意されたコントローラを使用することができます。インターフェースはブラウザに依存します。
コントローラーは使用せず、JavaScriptで操作する場合の記述は、次のセクションにまとめています。

index.html
<video src="./hoge.mp4" controls>
  <p>ご使用のブラウザでは動画再生に対応していません</p>
</video>

その他、 <video>要素には、以下の属性を指定できます。

属性 機能
autoplay ロードされたら自動的に再生を開始 なし
loop ループ再生する なし
muted デフォルトで音量をゼロにする なし
preload データのプリロードについての指定 "none"/"metadata"/"auto"
poster データが再生可能になるまでに表示させる画像 画像のパス
width 高さ 整数値
height 整数値

参考: https://developer.mozilla.org/ja/docs/Web/HTML/Element/video

JavaScriptでの動画再生

JavaScriptで動画を操作する場合の主要な記述を以下にまとめています。

動画の再生操作

index.html
<video id="video" src="./hoge.mp4">
  <p>ご使用のブラウザでは動画再生に対応していません</p>
</video>
main.js
var v = document.getElementById('video');
//再生
v.play();
//一時停止
v.pause();
//ロード
v.load();

play()

paused 属性をfalseに設定する、必要に応じリソースをロードする、再生を開始する

pause()

再生を中断する、paused属性をtrueに設定する、必要に応じリソースをロードする

load()

要素をリセットする、新たなリソースを選択しロードを開始する

JavaScriptでの再生位置の取得

main.js
//再生位置の取得
v.addEventListener('timeupdate', function() {
  if (v.currentTime !== 0) {
    console.log(timeConvert(v.currentTime));
  } else {
    console.log('0:00');
  }
})
//数値型から”00:00”表記への変換(秒、ミリ秒の場合)
function timeConvert(time) {
  var sec = Math.floor(time);
  var msec = ((time - sec) * 100).toFixed(0);
  return sec + ':' + msec;
}

currentTimeプロパティ

再生位置を数値型データ(秒単位)で返す

durationプロパティ

メディアの再生時間を数値型データ(秒単位)で返す

再生状態に関するプロパティ

  • played: 再生が完了した時間の長さを表す
  • paused: 再生が一時停止されているかどうかをBoolean値で表す
  • ended: 再生が終了しているかどうかをBoolean値で表す
  • error: 直近で発生したメディアのダウンロード中のエラーをerrorオブジェクトで返す

再生の設定に関するプロパティ

  • loop: 繰り返し再生の有効・無効をBoolean値で表す
  • controls: 再生をコントロールするユーザインタフェースの表示・非表示をBoolean値で表す
  • preload: メディアをプリロードすべきか指定する、nonemetadataautoのいずれかの値をとる
  • autoplay: htmlのautoplay属性を反映し、Boolean値で表す

再生状態に関するイベントハンドラ

  • play: 再生が開始したとき
  • timeupdate: 再生位置が変化したとき
  • pause: 再生が中断したとき
  • playing: 再生中断状態から、ふたたび再生可能になったとき
  • waiting: 次のフレームの受信を待っているとき
  • ended: 再生が完了したとき
  • error: 再生中にエラーが発生したとき
  • abort: エラー以外の原因で再生が停止したとき

メディアの読み込みステータスの取得

readyStateプロパティ

メディアリソースの読み込みの状態を取得する。戻り値は以下の通り。

  • 0 :HAVE_NOTHING
    リソースに関するいかなる情報も利用できない状態

  • 1: HAVE_METADATA
    リソースの情報(ビデオ要素の場合、ビデオの高さ・幅など)を取得済み、再生位置に関するデータは未取得

  • 2: HAVE_CURRENT_DATA
    再生位置に関するデータは取得済み、再生位置より先のフレームデータは未取得

  • 3: HAVE_FUTURE_DATA
    再生位置より先のフレームデータも取得済みで、早送りができる状態

  • 4: DONE(完了)
    3の状態で、なおかつ、十分なデータがロードできていて、このまま再生しても、再生位置が読み込みデータを追い越さないような状態

networkStateプロパティ

メディアリソースの読み込みのネットワークの状態を取得する。戻り値は以下の通り。

  • 0: NETWORK_EMPTY
    リソースに関するいかなる情報も利用できない状態
    redayStateプロパティのHAVE_NOTHINGと同じ状態)

  • 1: NETWORK_EMPTY
    要素がアクティブではあるが、ネットワークは使用されていない状態 (リソースが取得できている)

  • 2: NETWORK_LOADING
    リソースの読み込み中

  • 3: NETWORK_NO_SOURCE
    リソースが見つからない

ロード状態に関するイベントハンドラ

index.html
<video id="video">
  <source src="./hoge.mp4" type="video/mp4">
  <p>ご使用のブラウザでは動画再生に対応していません</p>
</video>
<p id="state"></p>
main.js
document.addEventListener('DOMContentLoaded', function() {
  var v = document.getElementById('video');
  var state = document.getElementById('state');
  //ロード開始
  v.addEventListener('loadedmetadata', function() {
    state.textContent = 'ロードを開始しました';
  })
  //読み込み完了
  v.addEventListener('loadeddata', function() {
    state.textContent = '読み込み完了しました';
  })
  //再生可能
  v.addEventListener('canplay', function() {
    state.textContent = '再生可能です';
  })
  //再生中
  v.addEventListener('playing', function() {
    state.textContent = '再生中です';
})

参考

https://developer.mozilla.org/ja/docs/Web/HTML/Element/video
https://developer.mozilla.org/ja/docs/Web/API/HTMLMediaElement

66
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
57