Chromecast上的YouTube iframe api行为

Chromecast上的YouTube iframe api行为,youtube,youtube-api,chromecast,Youtube,Youtube Api,Chromecast,尝试在Chromecast上播放YouTube视频,不使用YouTube接收器,只使用iframe YouTube api。当接收器url加载到桌面chrome浏览器时,它会播放ok,但当相同的url加载到Chromecast时,我会收到消息“此视频当前不可用-了解更多信息”。如果我一直试图让小部件在创建后播放不同的视频,它有时还会说“视频播放需要Adobe Flash Player” 小部件是在onyoutubeiframeapiredy()回调中使用新的YT.Player创建的,如文档所示。

尝试在Chromecast上播放YouTube视频,不使用YouTube接收器,只使用iframe YouTube api。当接收器url加载到桌面chrome浏览器时,它会播放ok,但当相同的url加载到Chromecast时,我会收到消息“此视频当前不可用-了解更多信息”。如果我一直试图让小部件在创建后播放不同的视频,它有时还会说“视频播放需要Adobe Flash Player”


小部件是在onyoutubeiframeapiredy()回调中使用新的YT.Player创建的,如文档所示。也许我有点困惑,但我认为iframeapi是基于html5的,而不是基于flash的。是否有人成功实现了这一点,或者Chromecast不支持这一点,因此出现了这种奇怪的行为?我还偶然发现了这个

这是我目前在接收器上使用的代码。消息处理(双向)是随意的,我目前正在处理这个问题。。。但是iFrame库的加载、视频的嵌入等都是可行的。如果它在你这方面不起作用,我们可以开始调查你的设置可能会有什么不同。我试着在可能有帮助的地方添加评论

<html>
<head>
<script src="https://www.gstatic.com/cast/js/receiver/1.0/cast_receiver.js">
</script>
<script type="text/javascript">
 // first create our receiver object and our channel handler
        var receiver = new cast.receiver.Receiver('{YOUR_APP_ID}', ['ChromecastYoutube'],"",5);
        var ytChannelHandler = new cast.receiver.ChannelHandler('ChromecastYoutube'); //  'using 'ChromecastYoutube' as my dev namespace. Wouldn't really be that in production.
        ytChannelHandler.addChannelFactory(receiver.createChannelFactory('ChromecastYoutube'));
        ytChannelHandler.addEventListener(
                cast.receiver.Channel.EventType.MESSAGE,
                onMessage.bind(this)
        );

        receiver.start();

        window.addEventListener('load', function() { // we won't try to load the iframe libraries until the chromecast window is fully loaded.
                var tag = document.createElement('script');
                tag.src = "https://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', {
                        height: '562',
                        width: '1000',
                        videoId: 'jLlSqucqXB0',
                        playerVars: { 'autoplay': 0, 'controls': 0 },
                        events: {
                                'onReady': onPlayerReady,
                                'onPlayerStateChange': onStateChange
                        }
                });
        }

        function onPlayerReady(event) {
                document.getElementById('annotation').innerHTML="We're ready to go";
        }

        function onStateChange(event) {
                switch (event.data) {
                        case YT.PlayerState.ENDED:
                                // TODO let sender know we're done, then close casting 
                                break;
                        case YT.PlayerState.PLAYING:
                                // TODO let sender know we're playing 
                                break;
                        case YT.PlayerState.PAUSED:
                                // TODO let sender know we're paused 
                                break;
                }
        }

        function onMessage(event) { // currently, any one of these will work, but subsequent ones seem to falter. Investigating...
                ytBindings={"playVideo":player.playVideo(),"pauseVideo":player.pauseVideo(),"stopVideo":player.stopVideo(),"getStatus":player.getPlayerState()}
                ytBindings[event.message];
        }


</script>
<style>
#wrapper {
        width: 1000px;
        margin: 10px auto;
        text-align: center;
}
#annotation {
        color: #ffffcc;
        font-size: 200%;
        margin-top:25px;
}
</style>
</head>
<body>
<div id="wrapper">
<div id="player"></div>
<div id="annotation"></div>
</div>
</body>
</html>

//首先创建接收方对象和通道处理程序
var receiver=new cast.receiver.receiver(“{YOUR_APP_ID}”,['ChromecastYoutube'],”,5);
var ytChannelHandler=new cast.receiver.ChannelHandler('ChromecastYoutube');/'使用“ChromecastYoutube”作为我的开发名称空间。在生产中就不会这样了。
ytChannelHandler.addChannelFactory(receiver.createChannelFactory('ChromecastYoutube');
ytChannelHandler.addEventListener(
cast.receiver.Channel.EventType.MESSAGE,
onMessage.bind(这个)
);
receiver.start();
addEventListener('load',function(){//在chromecast窗口完全加载之前,我们不会尝试加载iframe库。
var tag=document.createElement('script');
tag.src=”https://www.youtube.com/iframe_api";
var firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
});
var播放器;
函数onyoutubeiframeapiredy(){
player=新的YT.player('player'{
高度:'562',
宽度:“1000”,
videoId:'jLlSqucqXB0',
PlayerBars:{“自动播放”:0,“控件”:0},
活动:{
“onReady”:onPlayerReady,
“onPlayerStateChange”:onStateChange
}
});
}
函数onPlayerReady(事件){
document.getElementById('annotation').innerHTML=“我们准备好了”;
}
函数onStateChange(事件){
开关(事件数据){
案例YT.PlayerState.ENDED:
//TODO让发送者知道我们完成了,然后关闭铸造
打破
案例YT.PlayerState.PLAYING:
//TODO让sender知道我们在玩
打破
案例YT.PlayerState.PAUSED:
//TODO让发件人知道我们已暂停
打破
}
}
函数onMessage(event){//目前,这些函数中的任何一个都可以工作,但随后的函数似乎会出现问题。。。
ytBindings={“playVideo”:player.playVideo(),“pauseVideo”:player.pauseVideo(),“stopVideo”:player.stopVideo(),“getStatus”:player.getPlayerState()}
ytBindings[event.message];
}
#包装纸{
宽度:1000px;
利润率:10px自动;
文本对齐:居中;
}
#注释{
颜色:#ffffcc;
字体大小:200%;
边缘顶部:25px;
}

当前行为:Chromecast固件16041以及Chromecast设置过程中是否正确设置了国家/地区代码现在似乎已修复。请参见此处的最新评论

旧答案: 以下是问题的根本原因: 某些视频可能无法使用Chromecast播放。私人视频、直播内容和未经批准用于移动播放的视频将不适用于Chromecast。
希望这会改变,杀死一个主要的Chromecast用例。

我也遇到了这个问题,并发现原因是我在视频开始前使用html5音频播放一些声音效果。移除音效后,youtube播放器再次工作

我已经成功地构建了一个利用iframeapi的接收器,而且我尝试过的任何视频都没有任何问题。什么视频ID给了你错误,所以我可以在我的接收器中尝试它们,如果成功,在这里分享代码作为答案?我尝试过的每一个。例如,从youtube api参考示例“M7lc1UVf-VE”中可以看出,让它工作起来非常令人鼓舞,可能只是配置/初始化。如果你能发布一些代码,那将非常有用。除了一个,它在各个方面都与我的类似。我先在一个iframe中设置一个SoundCloud小部件,然后在同一页面上随意添加一个YouTube iframe。看起来他们不能共存,但我不知道为什么。如果我删除SoundCloud小部件,那么视频就可以正常播放。如果你觉得如此倾向,那么添加这个。。。看起来更复杂,可能与附加的iframe无关。仅使用YouTube iframe,它就可以为我最初使用的一组视频ID工作,但我现在得到以下任何ID的闪存错误。。。。ktvTqknDobU、5NV6Rdv1a3I、E9SEJIGWRPK这些都是Vevo视频。不幸的是,Vevo(以及其他一些内容提供商,通常与音乐相关)在其视频中设置了限制,这样他们就不能成为em