YouTube Player APIを使ってYouTubeの動画をWebページへ埋め込んで制御する
2024年 3月14日 Posted 野々瀨(フロントエンドエンジニア)
YouTubeは動画を気軽で簡単にWebページへ埋め込むことができます。そのうちの一つとしてiframeで埋め込むことができます。 YouTubeではこのiframeで埋め込んだ動画を、自由なタイミングで読み込んだり、再生や停止などの操作を行えたりするAPIを提供しています。今回はそんなYouTubeのiframeの動画を、APIを使って制御する方法をご紹介します。
IFrame Player APIとは
YouTubeが提供しているIFrame Player APIというAPIがあります。このAPIは、YouTubeの動画をWebページへ埋め込むための方法の一つであるiframeを、任意のタイミングで読み込めるほか、再生や停止といった制御を自由に行うことができます。
また、この記事を書いている時点では、無料でかつGoogleアカウントを必要とせず、気軽に利用することができます。
使ってみる
まず、表示したい箇所にid属性を付与した空の要素(HTML)を用意します。
<div id="sample"></div>
続いて次のJavaScriptコードを記述します。
function onYouTubeIframeAPIReady() {
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270
});
}
window.addEventListener('DOMContentLoaded', () => {
const headElem = document.getElementsByTagName('head')[0];
const scriptElem = document.createElement('script');
scriptElem.src = 'https://www.youtube.com/iframe_api';
headElem.appendChild(scriptElem);
});
このJavaScriptは何をしているかといいますと、まず10行目から15行目まででIFrame Player APIのスクリプトを読み込むようにしています。
1行目でonYouTubeIframeAPIReady関数を用意していて、IFrame Player APIのスクリプトが読み込まれますと、自動的にこの関数を実行します。注意点としてonYouTubeIframeAPIReady関数はアロー関数で定義することはできず、またグローバルで定義する必要があります。
2行目~6行目でYT.Playerクラスを使用して動画プレーヤーを生成しています。YT.Playerクラスの第一引数には先ほど用意したHTMLのid属性値を指定し、第二引数に詳細な設定を指定します。第二引数については次のとおりです。
| プロパティ | 型 | 説明 |
|---|---|---|
| videoId | string |
再生する動画のIDを指定します。IDはURLの 「https://www.youtube.com/embed/動画ID」で確認することができます。 |
| width | number | 表示する横幅を指定します。 |
| height | number | 表示する高さを指定します。 |
| events | object | APIの何かしらのきっかけで発動するイベントです。詳しくは見出し「イベント」をご覧ください。 |
| playerVars | object | 動画プレーヤーの初期設定を行います。詳しくは見出し「プレーヤーの初期設定」をご覧ください。 |
イベント
eventsプロパティでは、APIの何かしらのきっかけで発動するイベントを受け取ることができます。発動するイベントは次のとおりです。
| プロパティ | 説明 |
|---|---|
| onReady | 動画プレーヤーの準備が完了し再生可能な状態である場合に発動します。 |
| onStateChange | プレーヤーの状況が変化した時に発動します。状況変化は再生開始時、一時停止時、バッファ時、再生完了(最後まで再生された)時、エラー時です。 |
| onPlaybackQualityChange | 動画の画質が変化した時に発動します。 |
| onPlaybackRateChange | 再生速度が変化した時に発動します。 |
| onError | プレーヤーが何かしらのエラーが発生した時に発動します。無効な設定値であったり、リクエストした動画が見つからなかったりした時にエラーとなります。 |
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270,
event : {
onReady : event => {
event.target.setVolume(50);
}
}
});
プレーヤーの初期設定
playerVarsプロパティでは、動画プレーヤーの初期設定を行うことができます。設定可能な内容は次のとおりです。
| プロパティ | 型 | 初期値 | 説明 |
|---|---|---|---|
| autoplay | number | 0 | 自動再生を行うかどうかを設定します。0を指定すると無効になり、1を指定すると有効になります。 |
| mute | number | 0 | 消音(ミュート)にするかどうかを設定します。0を指定すると無効になり、1を指定すると有効になります。 |
| start | number | 0 | 再生を開始する位置を秒で設定します。 |
| end | number | 再生を終了する位置を秒で設定します。startプロパティに関係がなく、動画の0秒を始点として指定します。 |
|
| loop | number | 0 | 再生リストの最後の動画を再生し終えた場合に、再生リストを最初から繰り返し再生するかどうかを設定します。0を指定すると無効になり、1を指定すると有効になります。このloopプロパティは、playlistプロパティを指定している場合のみ有効となります。 |
| controls | number | 1 | 再生やシークバーなど動画を制御するコントローラーを表示するかどうかを設定します。0を指定すると非表示になり、1を指定すると表示されます。 |
| fs | number | 1 | 全画面表示のボタンを表示するかどうかを設定します。0を指定すると非表示になり、1を指定すると表示されます。 |
| playlist | string | 複数の動画を順番に一つずつ再生するための動画を設定します。カンマ区切りで動画IDを指定していきます。なお、playlistプロパティを設定していれば、videoIdプロパティを指定していても、playlistプロパティが優先されて動画が再生されます。 |
|
| playsinline | number | 0 | プレーヤーをインラインで表示するか全画面で表示するかを設定します。0を指定すると全画面で表示され、1を指定するとインラインで表示されます。 |
| color | string | 'red' | シークバーの現在までの再生状況バーの色を設定します。設定値はredまたはwhiteのみです。 |
| cc_lang_pref | string | 表示される字幕の言語を設定します。設定値はISO 639-1 2 文字言語コードで指定します。 | |
| cc_load_policy | number | 字幕を初期で表示するかどうかを設定します。0を設定するとユーザー設定に基づき、1を指定すると初期で字幕を表示します。 |
|
| disablekb | number | 0 | キーボード操作に対応しないかどうかを設定します。0を指定すると対応し、1を指定すると対応しません。 |
| enablejsapi | number | 0 | 自身でiframeを生成し、IFrame Player APIでプレーヤーの開発を可能にするかどうかを設定します。0を指定すると無効にし、1を指定すると有効にします。 |
| hl | string | プレーヤーのインターフェースの言語を設定します。設定値はISO 639-1 2 文字言語コードで指定します | |
| iv_load_policy | number | 1 | 動画上にリンク機能を持つテキストであるアノテーションを表示するかどうかを設定します。1を指定すると表示され、3を指定すると非表示になります。 |
| listType | string | 動画リストの種類を設定します。設定値は再生リストである場合はplaylist、公開されている動画のリストの場合はuser_uploads、動画検索の結果である場合はsearchを指定することができます。listプロパティと組み合わせて指定します。 |
|
| list | string | listTypeプロパティで指定した種類の内容を設定します。listTypeプロパティがplaylistであれば再生リストのIDを指定し、user_uploadsであればユーザー名(半角英数字)を指定し、searchであれば検索キーワードを指定します。 |
|
| modestbranding | number | 0 | コントローラーにあるようなYouTubeのロゴを非表示にするかどうかを設定します。0を指定すると表示し、1を指定すると非表示になります。なお、colorプロパティをwhiteに設定している場合はこの設定は無効となり、ロゴが表示されます。 |
| origin | string | 動画を埋め込む先のURLのオリジンを設定します。設定値はhttps://www.example.co.jpのように指定します。 |
|
| rel | number | 1 | 再生が終了した後に関連動画を表示するかどうかを設定します。0を指定すると非表示にし、1を指定すると表示されます。 |
| widget_referrer | YouTubeアナリティクスに認識するためにURLのオリジンを設定します。YouTubeアナリティクスに再生状況などを送信する場合に指定します。 |
次のコードは、複数の動画を再生リストにし、コントローラーを非表示にしている例です。
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270,
playerVars : {
playlist : 'IqKz0SfHaqI,7ePhUVJQs00'
controls : 0
}
});
playerVarsプロパティの詳細は、公式ドキュメントの「サポートされるパラメータ」をご覧ください。
メソッド
YT.Playerクラスで生成されたインスタンスは、次のメソッドを使用することができます。
| メソッド名 | 構文 | 説明 |
|---|---|---|
| playVideo | player.playVideo() |
動画を再生します。 |
| stopVideo | player.stopVideo() |
動画を一時停止します。 |
| setVolume | player.setVolume(number) |
音量を設定します。第一引数に音量を0から100までの範囲で指定します。 |
| setLoop | player.setLoop(boolean) |
再生リストが全て再生し終えた場合に、繰り返して最初から再生を開始するかどうかを設定します。第一引数に、繰り返す場合はtrue、繰り返さない場合はfalseを指定します。 |
| setSize | player.setSize(number, number) |
プレーヤーの幅と高さを設定します。第一引数に幅を指定し、第二引数に高さを指定します。 |
| setShuffle | player.setShuffle(boolean) |
再生リストをシャッフルして再生するかどうかを設定します。第一引数に、シャッフルする場合はtrue、しない場合はfalseを指定します。 |
| setPlaybackQuality | player.setPlaybackQuality(string) |
動画の再生される画質を設定します。第一引数に画質の名称を指定します。設定値は次のとおりです。small、medium、large、hd720、hd1080、highres、default |
| setLoop | player.seekTo(number, boolean) |
現在の再生位置を設定します。第一引数に変更する再生の位置を秒で指定します。第二引数は任意で、指定した再生位置がバッファにない場合にサーバーへリクエストするかどうかを指定します。 |
| getPlayerState | number = player.getPlayerState() |
現在の再生状況を取得します。取得される値は次のとおりです。-1 …… 未開始0 …… 終了1 …… 再生中2 …… 一時停止3 …… バッファリング中 |
| getCurrentTime | number = player.getCurrentTime() |
現在の再生時間(どこまで再生したか)を秒で取得します。 |
| getDuration | number = player.getDuration() |
動画の合計時間を秒で取得します。 |
| getVideoUrl | string = player.getVideoUrl() |
現在再生中の動画のYouTubeのURLを取得します。 |
| getVideoEmbedCode | string = player.getVideoEmbedCode() |
プレーヤーの埋め込み用コードを取得します。 |
| getPlaybackQuality | player.getPlaybackQuality() |
現在、再生されている画質を取得します。戻り値はsetPlaybackQualityメソッドの引数で設定可能な値と同じです。 |
| getPlaybackRate | number = player.getPlaybackRate() |
現在の再生速度を取得します。標準速度を1としたときの値を返します。例えば、2倍なら2を返します。 |
| getPlaylist | string[] = player.getPlaylist() |
再生リストの動画IDを配列で取得します。 |
| getPlaylistIndex | number = player.getPlaylistIndex() |
再生リストから現在再生されている動画のインデックス番号を取得します。 |
| destroy | player.destroy() |
プレーヤーを破棄します。 |
次のコードは、.change-volumeというbutton要素を押した時に、音量を50%に設定する例です。
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270
});
document.querySelector('.change-volume').addEventListener('click', () => {
player.setVolume(50);
});
メソッドの詳細は、公式ドキュメントの「再生の制御とプレーヤーの設定」をご覧ください。
自動再生
ページ読み込み時に動画を自動再生するには、playerVarsプロパティのautoplayプロパティを1に設定します。
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270,
playerVars : {
autoplay : 1
}
});
しかし、この設定を行っても自動的に再生されません。これはYouTubeのiframeでは内部的にvideo要素を使用していますが、仕様で消音状態にしていないと自動再生を有効にすることができないようになっています。
というわけで、playerVarsプロパティのmuteプロパティも1に設定します。
const player = new YT.Player('sample', {
videoId : 'IqKz0SfHaqI',
width : 480,
height : 270,
playerVars : {
autoplay : 1,
mute : 1
}
});
