トップへ(mam-mam.net/)

YouTubeの動画をWebページへ埋め込む | YouTube Player API

YouTubeの動画をWebページへ埋め込む

YouTubeの動画をWebページへ埋め込むには、対象の動画のページを開いて右クリックし「埋め込みコードをコピー」をクリックして、 Webページのソース内に「貼り付け」するだけで埋め込むことが出来ます。

(貼り付け 例)

<iframe width="639" height="360" src="https://www.youtube.com/embed/sQUZ0HPaYUs" 
    title="焚き火動画 ZenCamps NT Fire Stand" frameborder="0" 
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" 
    referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>
</iframe>
<iframe width="640" height="360" src="https://www.youtube.com/embed/JDRx2nGxWLY" 
    title="ゆる〜くソロキャンプ 1泊目" frameborder="0" 
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" 
    referrerpolicy="strict-origin-when-cross-origin" allowfullscreen>
</iframe>

「YouTube Player API」で動画をWebページへ埋め込む

「YouTube Player API」を使用するとJavascriptで多くの操作やカスタマイズを行うことが出来ます。

YouTube Player API がロードされると自動的にonYouTubeIframeAPIReady関数が呼び出されます。
ここで以下の引数を与えて YT.Player のコンストラクタを呼び出してインスタンスを作成します。

events.OnReadyYoutubeプレーヤーが操作可能になった時に呼び出される関数を指定
events.onStateChangeYoutubeプレイヤーの状態が変化した時に呼び出される関数を指定

次にOnReady関数が呼び出されるので、
引数に1つ又は複数の Youtube動画ID を指定してloadPlaylist()関数を呼び出します。

「動画の再生準備が完了する」等Youtubeプレイヤーの状態が変更するとonStateChange関数が呼び出されます。
自動再生(ミュートしないと自動再生できない)したい場合はこの関数内にソースコードを記述します。

<div id="player" style="box-sizing:border-box; width:100%; height:auto; max-width:640px; aspect-ratio:16/9;"></div>
<script src="https://www.youtube.com/iframe_api"></script>
<script>
  let player;
  //YouTube Player API がロードされた際に自動的に「onYouTubeIframeAPIReady」関数が呼び出される
  function onYouTubeIframeAPIReady(){
    player = new YT.Player(
      "player",  //動画を表示する要素タグのIDを指定
      {
        //width: "639",height: "360", //CSSで設定しているので与えない
        events: {
          "onReady": onReady, // Youtubeプレーヤーが操作可能になった時に呼び出される関数を指定
          "onStateChange": onStateChange,  //Youtubeプレイヤーの状態が変化した時に呼び出される関数を指定
        }
      }
    );
  }
  function onReady(playerEvent){
    //Youtubeプレーヤーが操作可能になった時
    //再生リストをロードします
    playerEvent.target.loadPlaylist({
        playlist: ['sQUZ0HPaYUs', 'JDRx2nGxWLY',], // 動画IDの配列を指定
        index: 0,                   //再生を開始する動画リストのインデックス(0~)
        startSeconds: 0,            //再生を開始する位置(秒)
        suggestedQuality: 'highres' //推奨画質
    });
  }
  function onStateChange(playerEvent){
    //Youtubeプレイヤーの状態が変化した時

    if(playerEvent.data === YT.PlayerState.ENDED){
      //最後の動画リストの再生が終了
      player.playVideoAt(0); //最初の動画リストを再生

    }else if(playerEvent.data === YT.PlayerState.UNSTARTED){
      //動画がロードされたが再生前の状態
      //「ミュート」に設定しないと自動再生できない
      playerEvent.target.mute();      //ミュート
      playerEvent.target.playVideo(); //動画を自動再生
    }
  }
</script>

YouTubeプレイヤーの状態遷移

function onStateChange(playerEvent)の「playerEvent.data」を確認すると、どのような状態に遷移したかわかります。

YT.PlayerState.PLAYING再生が開始された
YT.PlayerState.ENDED最後の動画リストの再生が終了
YT.PlayerState.PAUSED一時停止になった
YT.PlayerState.BUFFERINGバッファ中になった
YT.PlayerState.UNSTARTED動画がロードされたが再生前の状態
YT.PlayerState.CUED再生リストを使用していて次の動画が準備されている状態
  function onStateChange(playerEvent){
    //Youtubeプレイヤーの状態が変化した時
    if (playerEvent.data === YT.PlayerState.PLAYING){
      console.log("Playing");  //再生が開始された
    }else if(playerEvent.data === YT.PlayerState.ENDED){
      console.log("Ended");  //最後の動画リストの再生が終了
    }else if(playerEvent.data === YT.PlayerState.PAUSED){
      console.log("Paused");  //一時停止になった
    }else if(playerEvent.data === YT.PlayerState.BUFFERING){
      console.log("BUFFERING");  //バッファ中になった
    }else if(playerEvent.data === YT.PlayerState.UNSTARTED){
      console.log("UNSTARTED");  //動画がロードされたが再生前の状態
    }else if(playerEvent.data === YT.PlayerState.CUED){
      console.log("CUED");  //再生リストを使用していて次の動画が準備されている状態
    }
  }

「YouTube Player API」で使える関数(一部)

playVideo()動画の再生
pauseVideo()動画の停止
seekTo(second, allowSeekAhead) 再生位置の指定
second
先頭から何秒目の位置かを指定
allowSeekAhead
true(未バッファリング部分にもシーク可能)
false(現在バッファリングされている部分に制限)
setVolume(0~100)ボリュームの調整
setPlaybackRate(rate) 再生速度の変更
rate には
0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0
の値を指定可能
loadPlaylist(videoIds, index, startSeconds, suggestedQuality) 再生リストの読み込み
videoIds
再生リストの動画IDの配列を指定
(例1)['sQUZ0HPaYUs']
(例2)['sQUZ0HPaYUs', 'JDRx2nGxWLY']
index (省略可能)
再生を開始する再生リストのインデックス
(1つ目なら0、2つ目なら1)
startSeconds (省略可能)
再生を開始する先頭からの秒数
suggestedQuality (省略可能)
推奨画質で以下のいずれかを指定する
"small" "medium" "large" "hd720" "hd1080" "highres" "default"
getPlayerState() 現在のプレイヤーの状態(YT.PlayerState)が返ってくる
YT.PlayerState.PLAYING再生が開始された
YT.PlayerState.ENDED最後の動画リストの再生が終了
YT.PlayerState.PAUSED一時停止になった
YT.PlayerState.BUFFERINGバッファ中になった
YT.PlayerState.UNSTARTED動画がロードされたが再生前の状態
YT.PlayerState.CUED再生リストを使用していて次の動画が準備されている状態
mute()ミュート
unMute()ミュート解除
nextVideo()次の動画にスキップ
previousVideo()前の動画にスキップ
playVideoAt(インデックス)指定のインデックスの動画を再生
getPlaylistIndex()現在の再生インデックスを取得
getPlaylist()再生リストの内容を取得
getDuration()現在の動画の総再生時間(秒)
getCurrentTime()先頭からの再生中の時間(秒)
getVideoData() 現在再生中の動画情報を取得
let info=player.getVideoData();
console.log('タイトル:', info.title);
console.log('動画 ID:', info.video_id);
console.log('投稿者:', info.author);

実例

0/0

<div id="player" style="box-sizing:border-box; width:100%; height:auto; max-width:640px; aspect-ratio:16/9;"></div>
<div style="display:flex;">
  <div id="sec" style="border:1px solid #666;padding:8px;">0/0</div>
  <div id="info" style="border:1px solid #666;padding:8px;"></div>
</div>
<button onclick="playVideoAt(0)">1つ目の動画の0秒目へ</button><button onclick="playVideoAt(1)">2つ目の動画の0秒目へ</button><br>
<button onclick="seekTo(0)">0秒目にスキップ</button><button onclick="seekTo(200)">200秒目にスキップ</button><br>
<button onclick="setPlaybackRate(0.25)">1/4倍速</button><button onclick="setPlaybackRate(1)">1倍速</button>
<button onclick="setPlaybackRate(2)">2倍速</button><br>
<script src="https://www.youtube.com/iframe_api"></script>
<script>
  let player;

  //YouTube Player API がロードされた際に自動的に「onYouTubeIframeAPIReady」関数が呼び出される
  function onYouTubeIframeAPIReady(){
    player = new YT.Player(
      "player",  //動画を表示する要素タグのIDを指定
      {
        playerVars: {
            modestbranding: 0, //YouTubeロゴを非表示
            rel: 0,            //再生後や一時停止時に表示される関連動画を同じチャンネルに限定
            playsinline: 1,    //iOSでもインライン再生
            controls: 1,       //コントロールを表示
        },
        //width: "639",height: "360",
        events: {
          "onReady": onReady,              //操作可能になった時に呼び出される関数を指定
          "onStateChange": onStateChange,  //状態が変化した時に呼び出される関数を指定
        }
      }
    );
    setInterval(function(){
      if(player&&player.getCurrentTime){
        document.querySelector("#sec").innerText = 
          Math.trunc(player.getCurrentTime()) + "/" + Math.trunc(player.getDuration());
      }
    },500);
  }
  function onReady(playerEvent){
    //Youtubeプレーヤーが操作可能になった時
    //再生リストをロード
    playerEvent.target.loadPlaylist({
        playlist: ['sQUZ0HPaYUs', 'JDRx2nGxWLY',], // 動画IDの配列を指定
        index: 0,                   //再生を開始する動画リストのインデックス(0~)
        startSeconds: 0,            //再生を開始する位置(秒)
        suggestedQuality: 'highres' //推奨画質 small medium large hd720 hd1080 highres default
    });
    playerEvent.target.setVolume(50); //ボリューム設定
  }
  function onStateChange(playerEvent){
    //Youtubeプレイヤーの状態が変化した時
    if (playerEvent.data === YT.PlayerState.PLAYING){
      //再生が開始された
      getVideoData();
    }else if(playerEvent.data === YT.PlayerState.ENDED){
      //最後の動画リストの再生が終了
      player.playVideoAt(0); //最初の動画リストを再生
    }else if(playerEvent.data === YT.PlayerState.PAUSED){
      //一時停止になった
    }else if(playerEvent.data === YT.PlayerState.BUFFERING){
      //バッファ中になった
    }else if(playerEvent.data === YT.PlayerState.UNSTARTED){
      //動画がロードされたが再生前の状態
      //「ミュート」に設定しないと自動再生できない
      playerEvent.target.mute();      //ミュート
      playerEvent.target.playVideo(); //動画を再生
    }else if(playerEvent.data === YT.PlayerState.CUED){
      //再生リストを使用していて次の動画が準備されている状態
    }
  }
  function playVideoAt(idx){
    player.playVideoAt(idx);
  }
  function seekTo(sec){
    player.seekTo(sec);
  }
  function setPlaybackRate(rate){
    player.setPlaybackRate(rate);
  }
  function getVideoData(){
    let info=player.getVideoData();
    document.querySelector("#info").innerText = info.title + "/" + info.author;
  }
</script>