首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免在使用Youtube AS3 Player API时出现安全错误

如何避免在使用Youtube AS3 Player API时出现安全错误
EN

Stack Overflow用户
提问于 2010-09-24 15:46:58
回答 3查看 8.2K关注 0票数 2

我正在使用Youtube Flash Player API在AS3项目中加载视频。当我加载播放器swf时,我得到了这个非常恼人的错误:

代码语言:javascript
运行
复制
SecurityError: Error #2047: Security sandbox violation: parent: http://www.degoudenglimlach.be/main.swf cannot access http://www.youtube.com/[[IMPORT]]/s.ytimg.com/yt/swf/watch_as3-vflbgr4dW.swf.

在加载swf之前,我尝试将以下代码添加到我的代码中,但没有任何区别:

代码语言:javascript
运行
复制
Security.allowDomain("*");
Security.allowDomain("www.youtube.com");
Security.allowDomain("youtube.com");
Security.allowDomain("s.ytimg.com");
Security.allowDomain("i.ytimg.com");

任何帮助都是最好的。

下面是我的完整包装器类:

代码语言:javascript
运行
复制
package be.zap.media 
{
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.Security;
    import flash.system.System;

    /**
     * ...
     * @author Yens Resmann
     */
    public class ZapYoutubeVideo extends Sprite
    {
        private var ytPlayer : Object;
        private var ldr : Loader
        private static const YOUTUBE_EMBEDDED_PLAYER_URL : String = "http://www.youtube.com/v/VIDEO_ID?version=3";

        public static const PLAYER_READY : String = "playerReady";

        public static const QUALITY_SMALL : String = "small";
        public static const QUALITY_MEDIUM : String = "medium";
        public static const QUALITY_LARGE : String = "large";
        public static const QUALITY_HD720 : String = "hd720";
        public static const QUALITY_HD1080 : String = "hd1080";
        public static const QUALITY_HIGHRES : String = "highres";
        public static const QUALITY_DEFAULT : String = "default";

        public function ZapYoutubeVideo() 
        {
            Security.allowDomain("*");
            Security.allowDomain("www.youtube.com");
            Security.allowDomain("youtube.com");
            Security.allowDomain("s.ytimg.com");
            Security.allowDomain("i.ytimg.com");

            ldr = new Loader();
            ldr.contentLoaderInfo.addEventListener(Event.INIT, handleInitPlayer);
            addEventListener(Event.REMOVED_FROM_STAGE, handleRemovedFromStage);
        }

        public function initPlayer(vidId : String) 
        {
            var url : String = YOUTUBE_EMBEDDED_PLAYER_URL.split("VIDEO_ID").join(vidId);
            ldr.load(new URLRequest(url));
        }

        private function handleInitPlayer(e:Event):void 
        {
            addChild(ldr);
            ldr.contentLoaderInfo.removeEventListener(Event.INIT, handleInitPlayer);

            ldr.content.addEventListener("onReady", handlePlayerReady);
            ldr.content.addEventListener("onError", handlePlayerError);
            ldr.content.addEventListener("onStateChange", handlePlayerStageChange);
            ldr.content.addEventListener("onPlaybackQualityChange", handlePlayerQualityChange);
        }

        private function handlePlayerReady(e:Event):void 
        {
            ytPlayer = ldr.content;
            dispatchEvent(new Event(PLAYER_READY));
        }

        public function queueVideoById(videoID : String, quality : String = QUALITY_DEFAULT):void 
        {
            ytPlayer.cueVideoById(videoID, 0, quality);
        }

        public function loadVideoById(videoID : String, quality : String = QUALITY_DEFAULT):void 
        {
            ytPlayer.loadVideoById(videoID, 0, quality);
        }

        public function queueVideoByUrl(url : String, quality : String = QUALITY_DEFAULT):void 
        {
            ytPlayer.cueVideoByUrl(url, 0, quality);
        }

        public function loadVideoByUrl(url : String, quality : String = QUALITY_DEFAULT):void 
        {
            ytPlayer.loadVideoByUrl(url, 0, quality);
        }

        public function setSize(w:int, h:int):void 
        {
            ytPlayer.setSize(w, h);
        }

        private function handlePlayerError(e:Event):void 
        {

        }

        private function handlePlayerStageChange(e:Event):void 
        {

        }

        private function handlePlayerQualityChange(e:Event):void 
        {

        }

        private function handleRemovedFromStage(e:Event):void 
        {
            removeEventListener(Event.REMOVED_FROM_STAGE, handleRemovedFromStage);
            dispose();
        }

        public function dispose():void 
        {
            ytPlayer.destroy();
            if (ldr) {
                if (contains(ldr)) {
                    removeChild(ldr);
                }
                ldr = null;
            }
        }

        /**
         * parse out the Youtube Video ID from the video URL
         * @param   url
         * @return String
         */
        public static function getIdFromURL(url:String):String
        {
            var parts : Array = [];
            if (url.indexOf("watch?v=") != -1) {
                parts = url.split("watch?v=");
            } else if (url.indexOf("watch/v/") != -1) {
                parts = url.split("watch/v/");
            } else if (url.indexOf("youtu.be/") != -1) {
                parts = url.split("youtu.be/");
            }
            return String(parts[1]).split("/").join("");
        }

        /**
         * get the thumbnail of the video
         * @param String youtube Video ID
         * @return URLRequest
         */
        public static function getThumbnail(videoId : String):URLRequest
        {
            return new URLRequest("http://img.youtube.com/vi/" + videoId + "/0.jpg"); 
        }

    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-24 17:07:18

我认为这是不可能的,看看错误消息,你会发现他们主要需要处理的事实是YouTube没有更新他们的跨域策略文件,也没有指定元策略。下面是他们的策略文件:

代码语言:javascript
运行
复制
 <!-- http://www.youtube.com/crossdomain.xml --> 
 <!DOCTYPE cross-domain-policy 
  SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
 <cross-domain-policy> 
  <allow-access-from domain="*.youtube.com" /> 
  <allow-access-from domain="s.ytimg.com" /> 
 </cross-domain-policy> 

他们需要像这样添加一行:

代码语言:javascript
运行
复制
 <site-control permitted-cross-domain-policies="all"/>
票数 1
EN

Stack Overflow用户

发布于 2011-01-06 23:47:27

我正在使用这个函数

代码语言:javascript
运行
复制
private function test():void 
{ 
    var ytLoader:SWFLoader = new SWFLoader();
    ytLoader.addEventListener(Event.INIT, playerLoaderInitHandler);
    ytLoader.loaderContext = new LoaderContext(true);
    ytLoader.load("http://www.youtube.com/v/TXrc6BwGCXE?version=3");
}
private function playerLoaderInitHandler(event:Event):void
{
    var loader:SWFLoader = event.currentTarget as SWFLoader;
    addChild(loader);
}

我使用的是SWFLoader而不是Loader。

票数 1
EN

Stack Overflow用户

发布于 2015-01-05 08:29:03

我也遇到了同样的问题,并且花了很多时间试图在不隐藏错误的情况下进行修复。所以我做出了一个非常疯狂的举动。根据我的错误,进一步的跟踪堆栈如下所示:

代码语言:javascript
运行
复制
error before ....
 cannot access https://s.ytimg.com/yts/swfbin/player-vflzYgZmb/watch_as3.swf.
 at flash.display::DisplayObject/get parent()
 at fl.managers::FocusManager/isTabVisible()
 at fl.managers::FocusManager/tabEnabledChangeHandler()
 at flash.events::EventDispatcher/dispatchEventFunction()
 at flash.events::EventDispatcher/dispatchEvent()
 at com.google.youtube.ui::UIElement/onAddedToStage()

所以我注意到,youtube播放器API正在检查是否启用了标签孩子,所以我只是删除了它,并在放置播放器的容器MC中添加了它:

代码语言:javascript
运行
复制
this.tabChildren = false; 

猜猜发生了什么--没有更多的错误!我还需要在将tabChildren设置为false后,当播放器准备就绪时添加到stage player。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3785124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档