<video>要素
Technical Summary
videoは、動画データを文書内で再生するembedded content要素であり、共通のHTMLMediaElement処理モデルに参加します。要素固有のposter・動画寸法・playsinlineに加えて、resource選択、network / ready state、再生、seek、時間付きtext trackを関連付けて読む必要があります。
src属性の有無でcontent modelが変わります。play()はPromiseを返し、再生が許可されない場合はNotAllowedErrorでrejectされ得ます。標準の処理モデル、ブラウザーのmedia policy、ファイル・codec対応、native controls、アクセシビリティAPIの観測は別々のEvidenceとして扱います。
Definition / Categories
| 項目 | 定義 |
|---|---|
| 意味 | 動画、必要に応じて関連する音声・text trackを持つmedia resourceを再生する |
| Categories | Flow、Phrasing、Embedded、Palpable content。controls属性があればInteractive content |
| Context | Embedded contentが期待される場所 |
| Content model | srcがある場合とない場合で、source・track・transparent contentの順序が異なる |
| Tag omission | 開始タグ・終了タグとも省略不可 |
| Content attributes | グローバル属性、共通media属性、poster、playsinline、width、height、loading |
| DOM interface | HTMLVideoElement。HTMLMediaElementを継承 |
Content modelとresource selection
videoにsrc属性があるかどうかで、許される子要素の順序が分かれます。どちらの形でも、最後のtransparent contentに子孫media elementを置くことはできません。
| 条件 | 子要素のモデル |
|---|---|
srcあり | 0個以上のtrack、続いてtransparent content。sourceは置かない |
srcなし | 0個以上のsource、0個以上のtrack、続いてtransparent content |
<video controls width="640" height="360" poster="/media/lesson.jpg">
<source src="/media/lesson.webm" type="video/webm">
<source src="/media/lesson.mp4" type="video/mp4">
<track kind="captions" src="/media/lesson.en.vtt"
srclang="en" label="English captions" default>
This user agent does not support the video element.
</video>
media element内のsourceは代替media resourceの候補を示します。typeが分かる場合、user agentは対応しないtypeを持つ候補を取得前に飛ばせます。ただし、container / codec / profile対応、network、CORS、server応答が合わなければ再生できる保証はありません。picture内のsourceとは選択モデルが異なります。
video内のtransparent contentは、video elementをサポートしないuser agent向けの内容です。video elementを扱うuser agentでresource取得に失敗したとき、同じfallback本文が必ず表示されるわけではありません。取得失敗時の代替が必要なら、別の直接リンクやtranscriptを用意します。
要素固有属性と共通属性
| 属性 | 仕様上の役割 | 境界 |
|---|---|---|
src | media resourceのURL | 指定時はsource childではなくこのURLを入口にする |
poster | video dataを表示できない間に示す代表画像 | 字幕、transcript、代替説明ではない |
controls | user agentに操作UIの表示を要求 | 見た目・操作部品・AAM公開は実装とplatformの観測対象 |
preload | 取得するbuffer量についてのauthor hint | none・metadata・autoでも実際の取得量を断定できない |
autoplay | 条件を満たしたときresourceの自動再生を要求 | user agentはautoplayをサポートする必要がなく、user preferenceを考慮し得る |
muted / loop | muted stateの初期化 / 再生終了後に先頭へ戻す指定 | 現在状態は対応するIDL属性と区別して読む |
playsinline | 再生領域内でvideoを表示するよう促す | fullscreen動作やUIを全user agentで固定する指定ではない |
width / height | playback areaの寸法属性 | video resourceのnatural dimensionsとは別の値 |
crossorigin / loading | request mode / loading deferralの処理に関係する | resource・poster・text trackごとの取得結果を分けて観測する |
posterは、video dataがない間にelementが表す画像として使われます。videoWidthとvideoHeightはvideo resourceのnatural dimensionsを返し、dataがまだないときは0です。表示領域のCSS寸法やposterの寸法と混同しません。
Network stateとready state
networkStateはresource選択・取得の段階を、readyStateは現在どれだけmedia dataを利用できるかを表します。値の意味が異なり、ひとつの単純なloading progressとしてまとめられません。
| API | 観測するもの | 主な値・境界 |
|---|---|---|
networkState | resource selectionとdata取得 | NETWORK_EMPTY、NETWORK_IDLE、NETWORK_LOADING、NETWORK_NO_SOURCE |
readyState | 現在位置のmedia dataの利用可能性 | HAVE_NOTHINGからHAVE_ENOUGH_DATAまで。値は飛び越して変化し得る |
currentTime / duration | media timeline上の再生位置 / resourceの長さ | seek、範囲外、長さ未確定、終了時点を別に扱う。長さが未確定のlive resourceはInfinityになり得る |
| media events | 取得・metadata・buffer・再生・seekなどの状態変化 | loadedmetadata、canplay、waiting、playing、seeking、seekedなど。固定の一連の順序とは限らない |
preloadはhintで、browser cache、resource、network、user agent policyと合わせて確認します。イベント発火はmedia element taskとして処理され、ready stateが途中のすべての値を通る保証はありません。
再生要求とautoplay
HTMLMediaElement.play()はPromiseを返します。再生が許可されていない場合はNotAllowedError、対応可能なresourceが見つからない場合はNotSupportedErrorでrejectされ得ます。呼び出しだけで再生開始を断定せず、Promiseの結果とmedia eventを観測します。
const video = document.querySelector('video');
video.play().then(() => {
console.log('playback started');
}).catch((error) => {
console.log('playback did not start:', error.name);
});
HTML Standardはuser agentにautoplayの対応を義務付けていません。また、自動再生を使う場合も利用者が上書きできるようにし、自動再生を使わない方法を検討するようauthorsに勧めています。実装ごとのpolicy、muted条件、user activation、OS設定の結果はSPECの主張と分けて記録します。
Text trackと動画のアクセシビリティ
trackはmedia elementに外部の時間付きtext trackを関連付けます。kindにはsubtitles、captions、descriptions、chapters、metadataがあります。track cueはmedia timeline上の開始・終了時刻を持ちます。各track kindの意味、default、言語選択は本文で個別に確認し、すべてのtext trackを字幕と同一視しません。
HTML-AAMはvideoをcomputed role html-videoに対応付け、platform accessibility APIのmappingを定めています。controlsがある場合のUI公開はplatformごとに異なり得ます。仕様上のmapping、browser Accessibility Tree、platform API、支援技術での結果は同一のEvidenceではありません。
HTMLのtrackを用意することと、動画コンテンツがアクセシビリティ要件を満たすことは別の判断です。WCAG 2.2の時間依存メディア基準は、 prerecorded / live、音声・映像の情報、media alternativeとして明示されているかなどに応じて適用範囲が変わります。
DOM Interface
| API | 概要 | 条件・境界 |
|---|---|---|
width / height | 要素のdimension attributes | CSSで計算された描画サイズとは別 |
videoWidth / videoHeight | video resourceのnatural dimensions | media data未取得時は0 |
poster / playsInline | poster URL / inline再生のIDL surface | 反映属性の値と、実際のrender・再生挙動を分ける |
play() / pause() | 再生・停止要求 | play()はPromise。成功・拒否のどちらも処理する |
currentTime / duration / seekable | timeline、seek position、seekable range | live・streaming resourceでは有限のdurationや先頭からの完全なseekを仮定しない |
networkState / readyState / error | resource取得と現在の再生準備状態 | 異なる状態機械のsurfaceとして記録する |
textTracks / addTextTrack() | 関連text trackと追加API | 子track、script追加、resource内部tracksの由来を分ける |
Fact / Evidence(主張 / 根拠)
HTML Standard、HTML-AAM、WCAGに基づく主張と適用条件を示します。ブラウザー挙動の実測は下のImplementation Evidenceに分け、未実施の項目は確認済みとは扱いません。
| 種別 | Fact / 主張 | 条件・範囲 | 状態 | 根拠 |
|---|---|---|---|---|
| SPEC | videoはFlow・Phrasing・Embedded・Palpable contentであり、controlsがあればInteractive contentにも属します。 | embedded contentが期待される場所で使用。DOM interfaceはHTMLVideoElement。 | 確認済み | HTML Standard: the video element |
| SPEC | src属性の有無がsource・track・transparent contentの順序を決めます。 | srcがあるcontent modelではsource childは含まれず、いずれのmodelも子孫media elementを除外します。 | 確認済み | HTML Standard: video content model |
| SPEC | posterはvideo dataが利用できない間にvideo elementが表す代表画像です。 | poster frame、natural dimensions、playback-area renderingを区別する。 | 確認済み | HTML Standard: poster and rendering |
| SPEC | networkStateとreadyStateは異なるmedia element stateを表し、ready stateは連続した順序で変化するとは限りません。 | resource fetching、metadata、buffer、playback state changeとtask/event処理。 | 確認済み | HTML Standard: media elements |
| SPEC | play()はPromiseを返し、再生が許可されない場合はNotAllowedErrorでrejectされます。 | resource unsupported時の失敗、user agent playback permission、autoplay supportと混同しない。 | 確認済み | HTML Standard: playing media |
| SPEC | trackはmedia elementにexternal timed text trackを指定します。 | captions、subtitles、descriptions、chapters、metadataは異なるtrack kind。cueはtimelineに結び付く。 | 確認済み | HTML Standard: the track element |
| AAM | HTML-AAMはvideoのcomputed roleをhtml-videoとし、controls UIのplatform mappingを定めます。 | spec mappingと個別browser / platform / assistive technologyの実測を分離する。 | 仕様確認済み | HTML-AAM: video |
| SPEC | WCAG時間依存メディア要件は、HTML elementの有無だけで決まらず、media type・内容・live / prerecorded等の適用条件に依存します。 | WCAG 2.2 SC 1.2.2、1.2.3、1.2.5などを個別の成功基準として確認する。 | 確認済み | WCAG 2.2: Captions (Prerecorded); Audio Description or Media Alternative (Prerecorded) |
Evidence
- HTML Standard: The video element — categories、content model、attributes、poster、HTMLVideoElement
- HTML Standard: Media elements — resource selection、network / ready states、playback、seeking、events、autoplay
- HTML Standard: The track element and timed text tracks — track kinds、cues、language、default、text track API
- HTML Accessibility API Mappings: video — computed role and platform control mapping
- WCAG 2.2 SC 1.2.2 and SC 1.2.3 — prerecorded synchronized media criteria and conditions
- Web Platform Tests: the-video-element and media-elements — test discovery entry points; no results are claimed here
Implementation Evidence
仕様上の主張とブラウザー実装、WPT、Accessibility Treeの観測を分けて登録しています。選定した実測とtestを実施済みです。各行の記録に観測環境と未確認の範囲を示します。
実測fixture: video-v1を作成し、Chrome 153の単一環境で動画読込・再生・字幕表示とAccessibility Treeを観測しました。WPTは選定8ファイルを実行しました。詳細は下記Evidence行を参照してください。全browser・全test suite・platform accessibility mappingの網羅は引き続き未完了です。
| 種別 | 再現確認の範囲 | 記録する条件 | 状態 |
|---|---|---|---|
| IMPL | src / source candidate selection、poster・寸法、networkState / readyState、play() Promise・media events、text track、controlsのAccessibility Tree | 2026-09-24 / Chrome 153.0.8010.50 / Windows NT 10.0.26200.0。video-v1のVP8 / Opus WebM(320×180、3.008秒)を127.0.0.1:4173で計測。未対応MIME候補を飛ばしてsample.webmを選択し、loadstart → loadedmetadata → loadeddata → canplay、networkState 2→1、readyState 0→1→4、videoWidth / videoHeightを確認。音声付きfixtureへのuser activation前のplay()はNotAllowedErrorでrejectし、専用button操作後はresolveしてplaying / pauseを観測。captions trackは1 cueを読み込み、描画を確認。未対応MIME候補だけの別videoはnetworkState 3 / error nullで、play Promiseは1.5秒で未settle。NotSupportedError条件、他browser・codecは未確認。 2026-09-25 / Chrome 153.0.8010.50 / Codex In-app Browserでfixtureを再実行。別button testはpassし、click handler内でnavigator.userActivation.isActive=true、play Promise resolve、playing発火を確認(volume=0、muted=false)。activationなし試行直前はisActive=false / hasBeenActive=falseだが、このvolume=0 fixtureではPromise resolveとplaying発火も観測。WPT元testの既定音量条件とは異なる追加観測として記録し、前回wpt.liveの結果は置き換えない。 |
部分実施(Chrome 153 / 1環境) |
| WPT | video element、resource selection、media state / playback、poster、track / timed textに対応するtest | 2026-09-24 / Chrome 153.0.8010.50 / Windows NT 10.0.26200.0 / wpt.live。選定8ファイルで17/17 pass: networkState_initial.html (2/2)、src_reflects_attribute_not_source_elements.html (2/2)、readyState_initial.html (2/2)、event_loadedmetadata_noautoplay.html (4/4)、event_canplay_noautoplay.html (4/4)、video-loading-eager.html (1/1)、track-load-from-src-readyState.html (1/1)、track-default-attribute.html (1/1)。追加のevent_playing_noautoplay.htmlは4件中2 pass・2 Not Run(runner上のscripted play()がuser activationなしでNotAllowedError)。test sourceはaudio/video各1件のsetupを同期実行し、各async testはplaying eventを待つ。Promiseを処理せずactivationなしで再生を始めるため、今回のChromeでは2つのsetupのみpassし、拒否された再生に対応する2つのasync testは未完了となった。これは再生後eventの不具合ではなく、testの再生許可前提と通常のwpt.live実行条件の不一致。event経路を再試験するならWebDriver runnerのtest_driver.bless()でuser activationを与え、再生拒否policyはPromise rejectionを検証する別testに分ける。track-mode.html、error-sequence.html、video-poster-clone-template.htmlは最終Harness summaryを取得できず未集計。選択範囲のみで、他browser・全directoryは未実施。 研究fixtureにtest_driver.bless()を使うuser-activation付きWPT候補をbuild-config/yugien/research-results/video-v1/wpt/event_playing_after_user_activation.htmlへ追加したが、WebDriver環境での実行は未実施。実測時のテスト版は未記録です。リンク先の内容は変わることがあり、当時と同じテストで再確認できるとは限りません。 |
部分実施(選定17/17 pass) |
| AAM | videoのcomputed role / accessible name、native controls、captions・text trackのAccessibility Tree公開 | 2026-09-24 / Chrome 153.0.8010.50 / Windows NT 10.0.26200.0。Chrome tabのAccessibility Tree snapshotでは、video surfaceがcontainer / Description Atlas video-v1 test clipとして現れ、buffer status、native control buttons、seek slider、popup buttonを確認。slider labelは動画シークバー。caption cueは映像上に描画されたが、snapshotでは独立nodeとして現れなかった。Windows platform accessibility API、Narrator / NVDA等の支援技術、他browserは未観測。 |
部分実施(Chrome Tree) |
codec、media file、network、user activation、user preference、browser、OS、native controls、platform API、支援技術による結果を分けて記録し、単一環境の結果を横断的な共通動作として一般化しません。
Coverage / Open Issues
- 確認済み意味、Categories、Context、
src別content model、主要属性、poster、HTMLVideoElement - 確認済みshared media resource selection、network / ready state、playback promise、event modelの仕様上の入口
- 確認済みtext track、HTML-AAM、WCAG時間依存メディア基準の根拠位置と適用境界
- 未完了Chrome、Firefox、Safariでのsource fallback、codec、network / ready state、event、poster、寸法の比較
- 未完了autoplay policy、user activation、preload、lazy loading、CORS、range request、media fragment、live streamの詳細実装比較
- 未完了他browserとの実測比較、全WPT directory、HTML-AAMの全platform mapping、OS accessibility APIと支援技術、字幕表示・選択の差
このページは初期Coverageです。仕様上の入口と根拠を整理したものであり、video全体の完全な検証、すべてのbrowserでの再生、またはすべてのmediaがアクセシビリティ基準を満たすことを主張しません。
Related surface
初心者向けの再生UI、字幕、poster、代替説明はYugienのvideo要素ページを参照してください。audioとの共通media modelはaudio要素で比較できます。sourceの親要素別候補選択はsource要素、時間付きテキストの仕様・WebVTT・Evidenceはtrack要素ページで確認できます。画像resource選択の比較にはpicture要素とimg要素、別文書の埋め込みとの境界にはiframe要素も確認できます。