<html>
  <body>
    <iframe id="player" type="text/html" width="640" height="390"
      src="http://www.youtube.com/embed/308nBBeRV24?enablejsapi=1&nohtml5=1"
        frameborder="0"></iframe>
    <br>
    Player status: <span id='playerStatus'>Unstarted</span>
    <br>
    Playback quality: <span id='playbackQuality'>None</span>
    <script>
      var tag = document.createElement('script');
      tag.src = "//www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange,
            'onPlaybackQualityChange': onQualityChange
          }
        });
      }
      function onPlayerReady(event) {
        playerStatus.innerHTML = 'Ready';
        event.target.playVideo();
        player.mute();
      }
      function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.PLAYING) {
          playerStatus.innerHTML = 'Playing';
        } else if (event.data == YT.PlayerState.BUFFERING) {
          playerStatus.innerHTML = 'Buffering';
        } else if (event.data == YT.PlayerState.PAUSED) {
          playerStatus.innerHTML = 'Paused';
        } else if (event.data == YT.PlayerState.CUED) {
          playerStatus.innerHTML = 'Video Cued';
        } else if (event.data == YT.PlayerState.ENDED) {
          playerStatus.innerHTML = 'Ended';
        } else {
          playerStatus.innerHTML = 'Undefined';
        }
      }
      function onQualityChange(event) {
        playbackQuality.innerHTML = player.getPlaybackQuality();
      }
    </script>
  </body>
</html>
