我有一个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)我有什么办法可以解决这个问题吗?
答案 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