YouTube iframe API不再在AIR StageWebView或C#WebBrowser中播放视频

时间:2017-09-27 20:16:16

标签: c# actionscript-3 flash youtube-api air

我有一个Adobe AIR应用程序,可以使用使用StageWebView实现的YouTube iframe API播放YouTube视频。它已经运作了好几年了,今天我发现它不播放YouTube视频。

如果我创建没有参数的StageWebView()(我一直这样做并且直到今天仍然没有问题),AIR使用WebKit。加载了YouTube iframe API,但视频无法播放。如果我右键单击该窗口并单击“Stats for nerds”,然后突出显示该文本并按Control + A将其全部选中,我在复制并将其粘贴到文本编辑器后得到以下内容:

  

“您的浏览器目前无法识别任何视频格式   可用“。

当我看到它无效时,我使用了StageWebView(true),它使用了机器的系统默认Web引擎。这无法成功加载YouTube iframe API,因此根本不会显示任何视频窗口。

以下是Adobe AIR(Animate CC 2017 / AIR v.26)中用于基本验证的代码:

var webView:StageWebView = new StageWebView();
webView.stage = this.stage;
webView.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
webView.loadURL("http://batsonengineering.com/testyt.html");

“testyt.html”中的代码是YouTube iframe API网页(https://developers.google.com/youtube/iframe_api_reference)上的示例,但我添加了一些警告语句以查看发生的情况。如果你运行它,你会看到如果我使用WebKit就不会出现警告(“4”),如果我使用默认的Web引擎,则不会出现警报(“3”)。以下是testyt.html中的代码:

<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>
    <script>
      // 2. This code loads the IFrame Player API code asynchronously.
alert("1");
      var tag = document.createElement('script');
      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
alert("2");
      // 3. This function creates an <iframe> (and YouTube player)
      //    after the API code downloads.
      var player;
      function onYouTubeIframeAPIReady() {
    alert("3");
        player = new YT.Player('player', {
          height: '390',
          width: '640',
          videoId: 'M7lc1UVf-VE',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }
      // 4. The API will call this function when the video player is ready.
      function onPlayerReady(event) {
    alert("4");
        event.target.playVideo();
      }
      // 5. The API calls this function when the player's state changes.
      //    The function indicates that when playing a video (state=1),
      //    the player should play for six seconds and then stop.
      var done = false;
      function onPlayerStateChange(event) {
    alert("5");
        if (event.data == YT.PlayerState.PLAYING && !done) {
          setTimeout(stopVideo, 6000);
          done = true;
        }
      }
      function stopVideo() {
        player.stopVideo();
      }
    </script>
  </body>
</html>

如果我改变了行:

webView.loadURL("http://batsonengineering.com/testyt.html");

到:

webView.loadURL("https://youtu.be/M7lc1UVf-VE");

这会将我带到此视频播放的YouTube页面,YouTube页面会加载,但如果我使用系统网络引擎,视频将无法播放。如果我使用WebKit,视频将播放。但是,我需要能够使用iframe API命令来控制视频,并且不希望向我的用户显示整个YouTube页面。我需要它嵌入。

在我这之后,我决定看看我是否可以让YouTube在C#WebBrowser组件中播放视频。这也行不通。但是,如果我直接在浏览器中运行http://batsonengineering.com/testyt.html,视频会播放。因此,YouTube似乎已经改变了一些内容,以防止在嵌入像StageWebView或WebBrowser这样的容器中时播放视频。

所以我的问题是:

  • 1)是什么让WebKit突然无法在StageWebView中播放YouTube视频?

  • 2)在StageWebView中,是什么让我的系统的网络引擎突然无法加载YouTube API?

  • 3)我有什么办法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

考虑一下:

  • 尝试在https服务器上放置HTML文件时加载? Youtube可能只接受来自安全( https )域名的外部请求。

  • 您不能将http内容与基于https的内容混合在一起。
    这意味着,如果您的域名为http://batsonengineering.com(使用HTTP),则无法使用tag.src = "https://www.youtube.com/iframe_api";等html代码(使用HTTPS)。
    尝试使用tag.src = "http://www.youtube.co... etc