<html>
  <body>
    <iframe id="player" type="text/html" width="640" height="390"
      src="http://www.youtube.com/embed/308nBBeRV24?enablejsapi=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();
      }
      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>
