《JavaScript》Youtubeの複数の動画をループ再生させる
公開日:2025年04月24日 最終更新日:2025年4月24日
YouTube IFrame Player APIを使って、複数の動画をループ再生する方法を紹介します。
音声はミュート設定で再生されます。
playerVarsプロパティで設定する
playerVarsプロパティでサポートされているplaylistのパラメータを使用します。
https://developers.google.com/youtube/player_parameters?hl=ja
DEMO
読み込みなしで次の動画が再生されます。
右上にYoutube側で作成された再生リスト(Untitled List)のアイコンがあります。
HTML
<div class="player1">
<div id="player1"></div>
</div>
CSS
動画をレスポンシブ対応させるためのCSSです。
.player1 {
aspect-ratio: 16 / 9;
height: auto;
width: 100%;
}
.player1 iframe {
border: 0;
height: 100%;
width: 100%;
}
JavaScript
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var players = {}; // プレイヤーを管理するためのオブジェクト
var videoIds = ['BzNfY5y7ABw', 'ATTW5zlZL2s']; // 動画IDの配列
var currentVideo = 0; // 再生中の動画のインデックス
function onYouTubePlayerAPIReady() {
players['player1'] = new YT.Player('player1', {
height: '720',
width: '1280',
videoId: videoIds[currentVideo],
playerVars: {
autoplay: 1, // 自動再生を有効化
mute: 1, // ミュートを有効化
loop: 1, // ループ再生
playlist: videoIds.join(','), // ループする動画のIDを指定
modestbranding: 1, // YouTube ロゴ非表示
iv_load_policy: 3, // 動画アノテーションを非表示
controls: 0, // コントロールバーを非表示
disablekb: 1, // キーボード操作無効
rel: 0, // 再生した動画と同じチャンネルから関連動画が選択
playsinline: 1 // インライン再生
},
events: {
'onStateChange': onPlayerStateChange // 動画の状態が変更されたときに実行
}
});
}
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.ENDED) { // 動画が終了したとき
currentVideo = (currentVideo + 1) % videoIds.length; // 次の動画に切り替え、最後まで行くと最初に戻る
players['player1'].loadVideoById(videoIds[currentVideo]); // 次の動画をロードして再生
}
}
eventsプロパティで設定する
eventsプロパティのonStateChangeを使用してループ再生させます。
DEMO
次の動画に移動する際に読み込みが発生します。
HTML
<div class="player2">
<div id="player2"></div>
</div>
CSS
動画をレスポンシブ対応させるためのCSSです。
.player2 {
aspect-ratio: 16 / 9;
height: auto;
width: 100%;
}
.player2 iframe {
border: 0;
height: 100%;
width: 100%;
}
JavaScript
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var players = {}; // プレイヤーを管理するためのオブジェクト
var videoIds = ['BzNfY5y7ABw', 'ATTW5zlZL2s']; // 動画IDの配列
var currentVideo2 = 0; // 再生中の動画のインデックス
function onYouTubePlayerAPIReady() {
players['player2'] = new YT.Player('player2', {
height: '720',
width: '1280',
videoId: videoIds[currentVideo2],
playerVars: {
autoplay: 1,
mute: 1,
modestbranding: 1,
iv_load_policy: 3,
controls: 0,
disablekb: 1,
rel: 0,
playsinline: 1
},
events: {
'onStateChange': function(event) {
if (event.data === YT.PlayerState.ENDED) {
currentVideo2 = (currentVideo2 + 1) % videoIds.length;
players['player2'].loadVideoById(videoIds[currentVideo2]);
}
}
}
});
}