同一ページ内でYouTubeプレーヤーを複数埋め込んだとき、
通常だと同時に再生することができてしまいます。
今回はこれを回避する方法を考えてみました。
対応方法案
対応方法として、以下の3案を考えました。
- YouTubeプレーヤーではなくサムネイルを設置するようにして、サムネイルをクリックしたら
ライトボックスを表示して再生するようにする。 - YouTubeプレーヤーの設置を一つだけにして、代わりにサムネイルを設置。
サムネイルをクリックでYouTubeプレーヤーのURLが切り替わるようにする。 - YouTubeプレーヤーをクリックして再生したときに、
他に再生しているYouTubeプレーヤーがあったら停止させる。
今回はYouTubeプレーヤーを複数埋め込むことが決まっていたたので、3番目を実装してみました。
ただ、実装するのは3案どれでも問題なさそうなので、場合に応じて選択でいいと思います。
※2番目のサンプルを別記事で作成しました。
YouTube動画をサムネイルクリックで切り替える
サンプルコード
今回はYouTubeプレーヤーを操作する必要があるので、YouTube Player APIを使用しました。
HTML
<div id="player01"></div> <div id="player02"></div> <div id="player03"></div> <div id="player04"></div>
JavaScript
// プレーヤーのサイズを指定
var ytWidth = 640;
var ytHeight = 390;
// 埋め込むyoutubeのIDと埋め込むエリアを指定
var ytData = [
{
id: 'S_ucMS7sxx8',
area: 'player01'
}, {
id: 'aIRAOr8WbXY',
area: 'player02'
}, {
id: 'RLZez82cp4w',
area: 'player03'
}, {
id: 'ZZ2IkhhXAEo',
area: 'player04'
}
];
var ytPlayer = [];
var ytPlaying, ytStop, ytPlay;
// YouTube Player APIを読み込む
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// API読み込み後に、各エリアにプレーヤーを埋め込む
function onYouTubeIframeAPIReady() {
for(var i = 0; i < ytData.length; i++) {
ytPlayer[i] = new YT.Player(ytData[i]['area'], {
height: ytHeight,
width: ytWidth,
videoId: ytData[i]['id'],
events: {
'onStateChange': onPlayerStateChange
}
});
}
}
// プレーヤーの状態に変化があった時に実行
function onPlayerStateChange(event) {
// 各プレーヤーの状態を確認
for(var i = 0; i < ytData.length; i++) {
var thisState = ytPlayer[i].getPlayerState();
if( thisState == 1 && ytPlaying == undefined) {
ytPlaying = i;
} else if(thisState == 1 && ytPlaying != i) {
ytStop = ytPlaying;
ytPlay = i;
} else {
}
}
// 同時再生があった場合、元々再生していた方を停止する
if(ytStop != undefined) {
ytPlayer[ytStop].pauseVideo();
ytStop = undefined;
}
// 現在再生中のプレーヤー番号を保存しておく
if(ytPlay != undefined) {
ytPlaying = ytPlay;
ytPlay = undefined;
}
}
はじめまして、突然のご連絡お許しください。
WEBサイト参考にさせて頂いております。
ありがとうございます。
一点ご質問がございます。
・同一ページ内でYouTubeを複数設置したときに、同時再生をさせないようにする
・ YouTube動画をサムネイルクリックで切り替える
を同様に使用したいのですが、上手くいきません。
どのように書けば両方合わせて使えますでしょうか?
お手数お掛けしますが、ご教授いただければ幸いです。
トヨオカさん
コメントありがとうございます。
YouTube動画をサムネイルクリックで切り替える、というのが分からなかったのですが、初期表示をサムネイルにしたいということでしょうか?
サンプル作成しましたが、以下のような形でしょうか。
https://cly7796.net/blog/sample/it-is-not-the-simultaneous-playback-of-youtube/index3.html