1. 導入
ほとんどのユーザーエージェントは自動再生メディアをブロックする独自のメカニズムを持ち、 それらのメカニズムは実装ごとに異なります。ウェブ開発者は自動再生メディアが許可されているかどうかを検出し、 代替コンテンツの選択やメディアが自動再生されない場合のユーザー体験向上のための対応が必要です。 例えば、ユーザーエージェントが聞こえる自動再生のみをブロックする場合、ウェブ開発者は聞こえるメディアを聞こえないメディアで置き換え、 メディア再生を維持することができます。 もしユーザーエージェントがすべての自動再生メディアを許可しないのであれば、 メディアリソースの読み込みや関連タスクを停止し、ユーザーの帯域幅やCPU消費を軽減できます。現在、この仕様は HTMLMediaElement
(video
および
audio)
と Web Audio API のみを扱います。この仕様は
Web Speech API や
アニメーション画像
(image、GIFアニメーション)
には対応しません。
2. 自動再生検出API
自動再生の検出はNavigator
オブジェクトを介して行うことができます。
結果は、指定されたメディアタイプのメディアが document
に存在し、
問い合わせた Navigator
オブジェクトに関連付けられた Window
オブジェクトで自動再生が許可されているか、
または個別の要素で自動再生が許可されているかを知ることができます。
2.1. 自動再生ポリシー列挙型
enum {AutoplayPolicy "allowed" ,"allowed-muted" ,"disallowed" };
| 列挙値 | 説明 |
|---|---|
"allowed"
| メディアの自動再生が許可されます。 |
"allowed-muted"
|
音が出ないメディア
の自動再生が許可されます。
注意: この属性は現在、指定されたメディアタイプや要素が
HTMLMediaElement
または HTMLVideoElement
や
HTMLAudioElement
などの拡張の場合のみ返されます。
音が出ないメディア要素
とは、以下のいずれかの条件を持つ HTMLMediaElement
です:
|
"disallowed"
| いかなるメディアも自動再生は許可されません。 |
disallowed)
の場合、
ページやメディアでユーザーが対応するジェスチャーを行うと
allowed
や allowed-muted
にポリシーが変化する可能性があります。
2.2. 自動再生検出メソッド
enum {AutoplayPolicyMediaType "mediaelement" ,"audiocontext" }; [Exposed =Window ]partial interface Navigator {AutoplayPolicy (getAutoplayPolicy AutoplayPolicyMediaType );type AutoplayPolicy (getAutoplayPolicy HTMLMediaElement );element AutoplayPolicy (getAutoplayPolicy AudioContext ); };context
| 列挙値 | 説明 |
|---|---|
mediaelement
|
HTMLMediaElement
や HTMLVideoElement
・ HTMLAudioElement
など拡張用の状態照会に使用します。
|
audiocontext
|
AudioContext
の状態照会に使用します。
|
2.2.1. メディアタイプによる照会
getAutoplayPolicy(type)
メソッドは 概略として
document
に存在し、
問い合わせた Navigator
オブジェクトに関連付けられた
Window
のメディア要素やオーディオコンテキストが自動再生できるかどうかの状態を返します。 概略とは、同じメディアタイプであってもすべての要素の結果が常に正しいわけではないことを意味します。
disallowed
でも
一部のメディア が自動再生を許可される場合があります。
この場合、正確な結果を得るためには個々の要素でも照会することが推奨されます。
例えば、最初はメディアタイプによる照会も、オブジェクトによる照会も disallowed。
その後ユーザーがメディア要素をクリックすると、その要素の照会は allowed
となり、
それはユーザーが意図的に操作したと判断されるからですが、
メディアタイプによる照会や他のまだクリックされていないメディア要素の照会は引き続き disallowed
となります。
getAutoplayPolicy(type)
メソッドが呼ばれた場合、 ユーザーエージェントは以下の手順を実行しなければなりません:
-
typeがmediaelementなら、HTMLMediaElementやHTMLVideoElement・HTMLAudioElementなど拡張がdocumentに存在し、 問い合わせたNavigatorオブジェクトに関連付けられたWindowオブジェクトの現在の状態を表す結果を返す。 -
typeがaudiocontextなら、AudioContextがdocumentに存在し、 問い合わせたNavigatorオブジェクトに関連付けられたWindowオブジェクトの現在の状態を表す結果を返す。
- 返値が
allowedの場合 - 指定されたタイプのすべてのメディアが自動再生可能です。
- 返値が
allowed-mutedの場合 -
指定されたタイプのすべての音が出ないメディアは自動再生可能です。
注意: この属性は、指定されたメディアタイプが
mediaelementの場合のみ返されます。 "音が出ないメディア" とは音が出ないメディア要素のことです。 - 返値が
disallowedの場合 - 指定されたタイプの いかなるメディアも 自動再生はできません。
Navigator
オブジェクトで照会した結果と
子ドキュメントの Navigator
オブジェクトで照会した結果が異なる場合があります。
allowed
で、埋め込みiframeのbar.comのドキュメント B では、 ユーザーエージェントによって
親ドキュメント A の結果を継承する場合もあれば、 異なる結果(例: disallowed)
を返す場合もあります。
前者は複雑さを下げ、 自動再生ブロックの挙動を一貫性のあるものにできます。後者はより細かい自動再生制御を実現します。
2.2.2. 要素による照会
getAutoplayPolicy(element)
および getAutoplayPolicy(context)
メソッドは、指定された要素の自動再生が現在許可されているかどうかの状態を返します。
- 返値が
allowedの場合 - この要素は現在の実行コンテキストで自動再生が許可されています。
- 返値が
allowed-mutedの場合 -
この要素は、音が出ない場合にのみ自動再生が許可されます。
注意: この属性は、指定された要素が
HTMLMediaElementまたはHTMLVideoElementやHTMLAudioElementなどの拡張の場合のみ返されます。"音が出ないメディア"は音が出ないメディア要素のことです。さらに、著者が音が出ないメディア要素を再生開始直後に音が出るようにした場合は、 その要素がもはや音が出ない状態ではなくなるため、ユーザーエージェントはそのメディア要素をすぐに一時停止することが推奨されます。
- 返値が
disallowedの場合 -
この要素は自動再生が許可されていません。
注意:
HTMLMediaElementでplay()を実行した場合、play()から返されるPromiseはNotAllowedError例外で拒否されます。AudioContextの場合は、AudioContextStateがsuspended状態のままになります。
メディアタイプによる照会結果と要素による照会結果が異なる場合、 著者は後者(要素による結果)を正しいものとして扱うべきです。例2にシナリオを示します。
HTMLMediaElement
(または、HTMLVideoElement
や HTMLAudioElement
などの拡張)
や AudioContext
でない場合は、
これらのメソッドは TypeError
を投げます。
3. 例
if ( navigator. getAutoplayPolicy( "mediaelement" ) === "allowed" ) { // 新しいメディア要素を生成し再生する。 } else if ( navigator. getAutoplayPolicy( "mediaelement" ) === "allowed-muted" ) { // 新しいメディア要素を生成し、ミュート再生にする。 } else { // 自動再生不可。代わりにポスター画像を表示するなど。 }
AudioContext
の開始許可を判定します。
if ( navigator. getAutoplayPolicy( "audiocontext" ) === "allowed" ) { let ac= new AudioContext(); ac. onstatechange= function () { if ( ac. state=== "running" ) { // オーディオアプリ開始。 } } } else { // オーディオコンテキストは開始不可。UI表示でユーザーに開始操作を促す。ac.resume()ハンドラから実行し、'onstatechange'で準備完了を検知。 }
function handlePlaySucceeded() { // コントロールUIを再生中に更新。 } function handlePlayFailed() { // ユーザーが明示的に動画を再生できるボタン表示 & 画像ポスターで動画を置換表示。 } let video= document. getElementById( "video" ); switch ( navigator. getAutoplayPolicy( video)) { case "allowed" : video. src= "video.webm" ; video. play(). then( handlePlaySucceeded, handlePlayFailed); break ; case "allowed-muted" : video. src= "video.webm" ; video. muted= true ; video. play(). then( handlePlaySucceeded, handlePlayFailed); break ; default : // 自動再生不可。リソースダウンロード不要。 handlePlayFailed(); break ; }
AudioContext
の開始許可を判定します。
let ac= new AudioContext(); if ( navigator. getAutoplayPolicy( ac) === "allowed" ) { ac. onstatechange= function () { if ( ac. state=== "running" ) { // オーディオアプリ開始。 } } } else { // UIでユーザーにアプリ開始操作を促す。ac.resume()ハンドラから実行、'onstatechange'でスタック準備完了検知。 }
4. セキュリティとプライバシーの考慮事項
自己レビュー質問票: セキュリティとプライバシー § questions に準拠。この仕様で導入されるAPIは、セキュリティおよびプライバシーへの影響が非常に低いです。 ユーザーの識別に使えるような機微情報は公開しません。 センサーやユーザーの端末の制御機能も公開しません。 オリジンに対して、ブラウズセッションをまたいで記憶される新たな状態の導入はありません。 オリジンが基盤プラットフォームにデータ送信することもできません。 新たなスクリプト実行やロード機構も導入・有効化しません。 オリジンがユーザーエージェントのネイティブUIに重ね描画することもありません。 オリジンがユーザーのプライベート閲覧か非プライベートかを検知することもありません。
5. 謝辞
この仕様は W3C media Working Group の協働による成果です。編者はこの仕様への貢献者として Alastor Wu, Becca Hughes, Christoph Guttandin, Chris Needham, Chris Pearce, Dale Curtis, Eric Carlson, François Daoust, Frank Liberato, Gary Katsevman, Jean-Yves Avenard, Jer Noble, Mattias Buelens, Mounir Lamouri, Paul Adenot および Tom Jenkinson に感謝します。