YouTube API播放器无法播放某些视频。

5
在YouTube Flash API中,错误代码0是什么意思?当使用API播放某些视频时会出现此错误。其他错误代码在API参考中有解释,但没有错误代码0的说明。
我该如何使YouTube播放器播放所有视频,就像YouTube播放器演示中一样?
FLA和SWF文件:https://s3.amazonaws.com/YouTubeAPIError0/YouTubeAPIError0.zip
package {
    import flash.system.Security;
    import flash.display.MovieClip;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.net.URLRequest;
    import fl.data.DataProvider;
    import fl.controls.ComboBox;
    import fl.controls.TextArea;

    public class YouTubeAS3 extends MovieClip {
        public var VidHolder:MovieClip;
        public var VidSelection:ComboBox;
        public var traceArea:TextArea;

        private var player:Object;
        private var loader:Loader;
        private var vidCollection:DataProvider;

        public function YouTubeAS3():void {
            Security.allowInsecureDomain("*");
            Security.allowDomain("*");

            vidCollection = new DataProvider();
            vidCollection.addItem({data:"eDdI7GhZSQA", label:"Video 1"});
            vidCollection.addItem({data:"S09F5MejfBE", label:"Video 2"});
            vidCollection.addItem({data:"QUwxKWT6m7U", label:"Video 3"});
            vidCollection.addItem({data:"TAbnQZZ6QXc", label:"Video 4"});
            vidCollection.addItem({data:"QH2-TGUlwu4", label:"Errorless Video"});

            VidSelection.dataProvider = vidCollection;
            VidSelection.addEventListener(Event.CHANGE, cueVideo);

            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
            loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
        }

        private function onLoaderInit(event:Event):void {
            VidHolder.addChild(loader);
            loader.content.addEventListener("onReady", onPlayerReady);
            loader.content.addEventListener("onError", onPlayerError);
            loader.content.addEventListener("onStateChange", onPlayerStateChange);
            loader.content.addEventListener("onPlaybackQualityChange", onVideoPlaybackQualityChange);
        }

        private function onPlayerReady(event:Event):void {
            traceArea.text += "player ready: " + Object(event).data + "\r";
            player = loader.content;
            player.setSize(480, 360);
            VidSelection.selectedIndex = 0;
            VidSelection.dispatchEvent(new Event(Event.CHANGE));
        }
        private function cueVideo(event:Event):void {
            traceArea.text += "switch to: " + event.target.selectedItem.label + "\r";
            player.cueVideoById(event.target.selectedItem.data);
        }

        private function onPlayerError(event:Event):void {
            traceArea.text += "player error: " + Object(event).data + "\r";
        }

        private function onPlayerStateChange(event:Event):void {
            traceArea.text += "player state: " + Object(event).data + "\r";
        }

        private function onVideoPlaybackQualityChange(event:Event):void {
            traceArea.text += "video quality: " + Object(event).data + "\r";
        }
    }
}

我的猜测是这可能是Youtube播放器中的一个错误,导致事件分发前错误未被正确初始化。不幸的是,我无法复制您所看到的情况 - 当我运行提供的示例代码时,它对我来说完全正常,没有任何错误。 - Josh Buhler
@joshbuhler 你的机器有什么特别之处?即使我多次通过美国/加拿大代理连接,前4个视频都持续出现错误0。 - Pleo
有其他人在使用上面的代码时遇到了奇怪的错误吗? - Pleo
我不知道有什么特别的。只是下载了代码并运行它。你提到了代理 - 你是在美国以外运行吗?如果是这样,你是否尝试过与不受所在国影响的视频一起使用它? - Josh Buhler
@joshbuhler,你说第一到四个视频的样本代码都能正常播放?事实上,我需要所有在YouTube网站上正常播放的视频都能够在API中无障碍地播放。当我在YouTube网站上查看这四个视频时(我在美国之外),它们都可以正常播放,但是当我尝试使用API播放它们时却不能正常播放。如果我知道至少来自美国的访问者能够查看所有视频,那会有些安慰。 - Pleo
3个回答


0

这个问题与YouTube AS3 Player API Error Code 0相同...当然,那个问题也没有答案(有趣的是,同样的4个视频被用作无法播放视频的示例)。

我唯一的建议是查找数据中的模式。例如,v3数据API显示你列出的所有4个无法播放的视频都在德国被封锁,而你提供的可以播放的视频没有这样的封锁。这会导致假设错误可能与区域封锁有关(请注意,区域封锁不同于“可嵌入”封锁,后者是上传者可以设置的元数据)。在德国被封锁的视频都是因为Vevo在那里不允许,它们都是Vevo视频。

当然,我并不是在暗示“无法播放”是有意为之的,虽然这也是可能的;我不知道有没有直接的文档详细说明API(与使用不同方法播放视频的Youtube网站相对应)尝试播放区域受限制的视频时会发生什么。也许@Dominic Orme是正确的,这与超时有关,这个超时是由于区域阻止(或尝试使用代理来绕过区域阻止)引起的。

您可以通过查找其他符合该模式的视频来测试这个理论。例如,您的代码是否无法播放所有Vevo视频?其他国家被屏蔽的视频是否也无法播放?


我尝试在发表我的问题之前添加一个示例代码,但是没有成功。无论如何,这四个视频并不是全部都是Vevo视频,只有第三个是。实际上,Vevo视频通常情况下都是可以播放的。我不在德国,所以无法确定这与地区限制有多大关系。观察到的模式之一是几乎所有的甲壳虫(The Beatles)视频都无法播放。相比之下,在YouTube网站上,所有视频都可以正常播放。 - Pleo
是的...关于Vevo的问题,我的错。我看到泰勒·斯威夫特的视频被封了,其他的我只是通过数据API查看了一下,所以做出了这个假设。然而,模式仍然表明你列出的4个视频在德国都被屏蔽了(再次强调,我不是在暗示你在德国,但也许有些内部因素导致了与此相关的错误)。你说Vevo的视频通常都能播放,那么还有哪些披头士的视频无法播放呢?此外,还有没有非音乐类的视频无法播放? - jlmcdonald
再次强调,根据我的经验,在网站上播放的内容通常与通过API播放视频的能力几乎没有关系,因为它们使用不同的检索、播放等方法。尽管您可能还想报告一下当您尝试使用iframe、javascript API等嵌入这些视频时会发生什么,以查看是否会得到不同的结果。 - jlmcdonald
我目前找到的音乐视频有:vU_sspkmDEc、tCo7kAV4RHQ、d8rd53WuojE、3QCZ_bv9aLc和_H4TlDxXxVk。 - Pleo
看起来所有这些视频都有地区限制(全部针对德国,其中一个还针对美国)。我注意到的另一件有趣的事情是,当尝试直接访问嵌入式SWF文件时(即http://www.youtube.com/embed/eDdI7GhZSQA),会显示一个消息,指出该视频“受到在某些网站上播放的限制”。无论请求的语言环境是否存在地区限制,这种情况都会发生。这告诉我,每当地区限制生效时,内部API都必须进行一些过滤,而这可能是导致错误的原因(正确或不正确)。 - jlmcdonald

0

我遇到了错误状态为0的问题 - 当视频超时时。

如果您在使用的任何浏览器的开发人员工具中查看,您应该会看到一个名为“videoplayback”的调用已经超时。我将其设置为7.5分钟后超时,但这可能与连接有关。

此外,“超时”错误不包含在当前记录的错误状态中。


但为什么它从来没有播放某些视频并产生错误代码0,而总是能够毫无问题地播放其他视频呢? - Pleo
选项列表目前为: HTML5播放器与Flash播放器(某些视频针对其中一个进行了优化) 广告 - YouTube将广告注入流中,我不知道如何检测它。 或者您曾经播放过一段视频,并且它被缓存到某个地方。 - Dominic Orme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接