我正在使用Youtube AS3播放器API在Flash项目中加载视频。 加载播放器swf时我得到这个非常烦人的错误:
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之前将以下内容添加到我的代码中,但它没有任何区别:
Security.allowDomain("*");
Security.allowDomain("www.youtube.com");
Security.allowDomain("youtube.com");
Security.allowDomain("s.ytimg.com");
Security.allowDomain("i.ytimg.com");
任何帮助都会很棒。
这是我完整的Wrapper课程:
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");
}
}
}
答案 0 :(得分:1)
我认为不可能,查看错误消息,您应该看到他们主要处理YouTube尚未更新其跨域策略文件而未指定元策略的事实。这是他们的政策文件:
<!-- 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>
他们需要添加这样一行:
<site-control permitted-cross-domain-policies="all"/>
答案 1 :(得分:1)
答案 2 :(得分:0)
我遇到了同样的问题,花了很多时间尝试修复而不隐藏错误。 所以我做了一个非常疯狂的举动。 根据我的错误,进一步的跟踪堆栈看起来像这样:
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正在检查是否启用了tab子项,所以我只是删除了它添加容器MC,其中放置了播放器:
this.tabChildren = false;
猜猜是什么 - 没有更多的错误!此外,我还需要在将tabChildren设置为false并且播放器准备就绪后添加到舞台播放器中。