動画を追加する方法
<video> 要素で動画ファイルを指定し、読者が再生できるよう controls を付けます。
<video src="movie.mp4" controls width="640"></video>
controls を付けると、ブラウザ独自のプレーヤーが表示されます。再生と一時停止、シークバー、音量、全画面表示です。これがないと動画はただそこにあるだけです。このプレビューは動画ファイルを読み込めないので、このページの例ではスクリプトで描いた小さな canvas のアニメーションを要素に流しています。属性はファイルのときとまったく同じように動きます。
ソースがファイルではなくライブのストリームなので、ここではシークバーをドラッグできず、決まった長さもありません。本物の .mp4 なら、同じプレーヤーに完全なシークバーが付きます。
video の属性
| 属性 | 働き |
|---|---|
controls | ブラウザのプレーヤーのコントロールを表示する |
autoplay | 再生できる状態になったらすぐに再生を始める (実際には muted のときだけ) |
muted | 音声をオフにした状態で始める |
loop | 終わったら最初からもう一度再生する |
playsinline | iPhone で全画面に切り替えずにページ内で再生する |
poster="thumb.jpg" | 動画の再生前に表示する画像 |
preload | none、metadata (サイズと長さだけ)、auto (どれだけダウンロードするかブラウザが決める) |
width、height | ピクセルでのサイズ。両方指定すると、動画の読み込み前から場所を確保する |
自動再生、muted、loop
ブラウザは、音声付きで勝手に再生が始まる動画をブロックします。ミュートした動画なら自動再生でき、背景動画やループする短いクリップはこの仕組みで動いています。
4 つの属性はセットで使います。再生を始める autoplay、ブラウザに許可させる muted、クリップを繰り返す loop、iPhone で全画面にしない playsinline です。音声付きの自動再生はブロックされるだけでなく、読み上げの音声がかき消されるスクリーンリーダーのユーザーにとっても問題です。クリップが 5 秒より長く再生されるなら、一時停止する手段を用意しましょう。
ポスター画像と preload
poster は、サムネイルのように、動画の再生前に画像を表示します。ここでは動画にソースがまったくないので、見えるのはポスターだけです。
preload="none" なら、読者が再生を押すまでブラウザは何もダウンロードせず、ポスターがあるので場所が空っぽに見えません。再生前に長さを表示したいなら preload="metadata" を使います。ポスターがない場合、ほとんどのブラウザは最初のフレームを読み込んだ時点でそれを表示します。
source による形式と代替手段
src の代わりに、<source> 要素で複数のファイルを並べられます。ブラウザは対応している最初のものを再生します。
<video controls width="640" poster="thumb.jpg">
<source src="movie.webm" type="video/webm">
<source src="movie.mp4" type="video/mp4">
<track kind="captions" src="captions.vtt" srclang="en" label="English">
<p>Your browser cannot play this video. <a href="movie.mp4">Download it</a>.</p>
</video>
H.264 の MP4 は現在のどのブラウザでも再生できるので、ファイルが 1 つだけなら安全な選択です。type 属性があれば、ブラウザは再生できない形式をダウンロードせずに飛ばせます。最後のテキストは、<video> にまったく対応していないブラウザでだけ表示されます。
track による字幕
<track kind="captions"> は、時間指定の行を並べたプレーンテキストのファイルである WebVTT ファイルを読み込みます。ブラウザはコントロールに字幕のボタンを追加し、動画の上にテキストを描きます。
WEBVTT
00:00:00.000 --> 00:00:03.000
Welcome to the course.
00:00:03.000 --> 00:00:06.500
Today we build our first web page.
字幕は、耳が聞こえない、または聞こえにくい視聴者、音を消して見ている人、第二言語で動画を見ている人の助けになります。クリックしなくても表示させるには、track に default を付けます。別のドメインにある字幕ファイルには、CORS ヘッダーと動画の crossorigin が必要です。
CSS でのスタイルと JavaScript での制御
動画は画像と同じ置換要素です。width: 100% と height: auto でレスポンシブになり、object-fit で形の違う箱をどう埋めるかを決めます。JavaScript では play()、pause()、currentTime、volume と、play、pause、ended などのイベントが使えます。
play() は、ブラウザが再生をブロックしたとき (たとえばミュートしていない自動再生) に拒否される Promise を返すので、本番のコードでは catch しましょう。独自のコントロールを作るかどうかは自由です。組み込みの controls はキーボードで操作でき翻訳もされていますが、独自のボタンではそれを再現しなければなりません。YouTube や Vimeo にある動画は、代わりに iframe でそのプレーヤーを埋め込みます。
よくある間違い
mutedなしの自動再生。 ブラウザにブロックされます。mutedとplaysinlineを付けましょう。controlsを忘れる。 独自のコントロールを作らない限り、読者は動画を再生できません。widthとheightがない。 動画が読み込まれたときにページがずれます。両方を指定し、CSS で拡大縮小しましょう。- 巨大なファイル。 Web 用に動画を圧縮し、ページの下のほうにある動画には
preload="none"か"metadata"を使いましょう。 - 話し声のある動画に字幕がない。
<track kind="captions">を追加しましょう。
よくある質問
HTML で動画を追加するにはどうすればいいですか?
<video src="movie.mp4" controls width="640"></video> と書きます。controls 属性でブラウザの再生ボタン、シークバー、音量が表示されます。これがないと、動画は最初のフレーム (またはポスター) を表示するだけで、ユーザーは再生を始められません。
動画が自動再生されないのはなぜですか?
ブラウザは音声付きの自動再生をブロックします。autoplay の横に muted を、iPhone で全画面ではなくページ内で再生させるために playsinline を付けましょう: <video autoplay muted loop playsinline>。
Web ではどの動画形式を使えばいいですか?
H.264 の MP4 は現在のどのブラウザでも再生できるので、安全な初期値です。<source> でより小さな WebM ファイルを先に並べ、ブラウザに対応する最初の形式を選ばせることもできます。
動画にサムネイルを付けるには?
poster 属性に画像の URL を指定します: <video poster="thumb.jpg" controls>。動画の再生が始まるまで画像が表示されます。
HTML の動画に字幕を付けるには?
動画の中に <track kind="captions" src="captions.vtt" srclang="en" label="English"> を追加します。ファイルは WebVTT 形式で、ブラウザはコントロールに字幕のボタンを表示します。
動画をレスポンシブにするには?
CSS で width: 100% と height: auto (または max-width: 100%) を指定します。動画は入れ物に合わせて伸び縮みし、縦横比を保ちます。