我写了一个小的swf容器,它应该加载一个视频文件并播放它。 我跟着official Adobe documentation,视频播放顺畅。
之后我添加了一些ExternalInterface API Callbacks来暂停,播放和恢复视频,所有这些都正常工作。这里只有一个非常恼人的问题:我无法获得有关视频当前状态的信息。通过javascript函数调用或swf文件中的内部调用都不会提供正确的信息。我做了一些挖掘,发现没有关于这个问题的信息。
这是swf文件的源代码和嵌入它的示例html:
HTML
<object id="ie-video" width="1280" height="720" type="application/x-shockwave-flash" data="flash_container.swf">
<param name="movie" value="flash_container.swf" />
<param name="wmode" value="opaque" />
<param name="flashvars" value="vid_name=video&objWidth=1280&objHeight=720" />
<param name="AllowScriptAccess" value="always">
</object>
SWF
import flash.external.*;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.net.NetStream;
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters.vid_name;
var objWidth:int = LoaderInfo(this.root.loaderInfo).parameters.objWidth;
var objHeight:int = LoaderInfo(this.root.loaderInfo).parameters.objHeight;
var videoPath:String = paramObj.toString() + ".flv";
var nc:NetConnection = new NetConnection();
nc.connect(null);
var vid:Video = new Video(objWidth, objHeight);
addChild(vid);
var ns:NetStream = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
var isVideoPlaying:Boolean;
var outputText:TextField = new TextField();
outputText.x = 10;
outputText.y = 10;
outputText.background = true;
outputText.autoSize = TextFieldAutoSize.LEFT;
addChild(outputText);
function netStatusHandler(event:NetStatusEvent):void
{
switch (event.info.code) {
case 'NetStream.Play.Start':
//ExternalInterface.call("fadeInPack()");
outputText.text = event.info.code.toString();
break;
case 'NetStream.Play.Stop':
outputText.text = event.info.code.toString();
break;
case "NetConnection.Connect.Success":
outputText.text = event.info.code.toString();
break;
case "NetStream.Play.StreamNotFound":
trace("Unable to locate video");
break;
}
}
function asyncErrorHandler(event:AsyncErrorEvent):void
{
//ignore error
}
function videoPause() {
ns.pause();
isVideoPlaying = false;
}
function videoResume() {
ns.resume();
isVideoPlaying = true;
}
function getCurrentTime() {
outputText.text = ns.info.toString();
return ns.info;
}
function videoTogglePause() {
ns.togglePause();
isVideoPlaying = !isVideoPlaying;
}
function videoIsPlaying() {
return isVideoPlaying;
}
function videoPlay() {
isVideoPlaying = true;
vid.attachNetStream(ns);
ns.play(videoPath);
outputText.text = ns.info.toString();
}
ExternalInterface.addCallback("videoPause",videoPause);
ExternalInterface.addCallback("videoResume", videoResume);
ExternalInterface.addCallback("getCurrentTime", getCurrentTime);
ExternalInterface.addCallback("togglePause", videoTogglePause);
ExternalInterface.addCallback("videoIsPlaying", videoIsPlaying);
ExternalInterface.addCallback("videoPlay", videoPlay);
外部呼叫的Javascript呼叫
element = document.getElementById('ie-video');
element.videoPlay();
element.getCurrentTime();
我尝试了不同的视频格式(flv和mp4),通过本地文件系统或网址访问,似乎没有任何工作。甚至info对象的内部打印也没有提供任何信息。任何帮助表示赞赏。
答案 0 :(得分:0)