我需要在ActionScript 2中动态创建一个Video对象并将其添加到影片剪辑中。在AS3中我只是这样做:
var videoViewComp:UIComponent; // created elsewhere
videoView = new Video();
videoView.width = 400;
videoView.height = 400;
this.videoViewComp.addChild(videoView);
不幸的是,我无法弄清楚如何在AS2中实现这一目标。视频不是MovieClip的孩子,所以attachMovie()似乎没有给我任何东西。我也没有看到任何与AS3的UIComponent.addChild()方法等效的内容。
有没有办法在AS2中动态创建实际出现在舞台上的Video对象?
我可能一次需要多个视频。是否可以复制该视频对象?
我想我还有另一个解决方案。它不是最优的,但它适合我必须为其他组件做的一些事情,所以它在项目中并不是太不合适。一旦我弄明白,我会发布我在这里做的事情。
答案 0 :(得分:1)
好的,我有一些工作。
首先,我创建了一个新的Library符号,并将其命名为“VideoWrapper”。然后我添加了一个视频对象,其ID为“视频”。
现在,只要我需要动态地将视频添加到我的状态,我就可以使用MovieClip.attachMovie()添加Video对象的新副本。
为了简化操作,我编写了一个VideoWrapper类,它暴露了基本的UI元素处理(setPosition(),setSize()等)。因此,当在常规UI布局代码中处理视频时,我只使用这些方法,因此它看起来就像我所有其他UI元素一样。在处理视频时,我只是访问该类的“视频”成员。
我的实际实现有点复杂,但这是我如何工作的基础知识。我有一个测试应用程序正在播放2个视频,一个来自本地摄像头,另一个来自FMS,它运行良好。
答案 1 :(得分:1)
要向您发送作为标记的行的末尾,我使用来自w3schools的HTML符号实体
从项目中取得的一个例子如下:
< asset path="library\video.swf" />
上面的行显示有一个名为library的目录,其中包含文件video.swf
此外,目录库中还有文件video.xml。该文件包含行
<xml version="1.0" encoding="utf-8" >
<movie version="7">
<frame>
<library>
<clip id="VideoDisplay">
<frame>
<video id="VideoSurface" width="160" height="120" />
<place id="VideoSurface" name="video" />
</frame>
</clip>
</library>
</frame>
</movie>
很久以前,我的儿子Alex从Internet下载了VideoDisplay类的代码和目录库
我已经改进了VideoDisplay类的代码。
写了2个成员
public function pos():Number
{
return ns.time;
}
public function close():Void
{
return ns.close();
}
我创建的程序
是
不仅仅是.flv
文件的浏览器和演示者
它也
是每个.flv
文件
现在VideoDisplay类的代码是:
class util.VideoDisplay
{
//{ PUBLIC MEMBERS
/**
* Create a new video display surface
*/
function VideoDisplay(targetURI:String, parent:MovieClip, name:String, depth:Number, initObj)
{
display = parent.attachMovie("VideoDisplay", name, depth, initObj);
// create video stream
nc = new NetConnection();
nc.connect(targetURI);
ns = new NetStream(nc);
// attach the video stream to the video object
display.video.attachVideo(ns);
}
/**
* Video surface dimensions
*/
function setSize(width:Number, heigth:Number):Void
{
display.video._width = width;
display.video._height = heigth;
}
/**
* Video clip position
*/
function setLocation(x:Number, y:Number):Void
{
display._x = x;
display._y = y;
}
/**
* Start streaming
* @param url FLV file
* @param bufferTime Buffer size (optional)
*/
public function play(url:String, bufferTime:Number):Void
{
if (bufferTime != undefined) ns.setBufferTime(bufferTime);
ns.play(url);
}
/**
* Pause streaming
*/
public function pause():Void
{
ns.pause();
}
/**
* Seek position in video
*/
public function seek(offset:Number):Void
{
ns.seek(offset);
}
/**
* Get position in video
*/
public function pos():Number
{
return ns.time;
}
public function close():Void
{
return ns.close();
}
//}
//{ PRIVATE MEMBERS
private var display:MovieClip;
private var nc:NetConnection;
private var ns:NetStream;
//}
}
答案 2 :(得分:0)
我建议您创建一个Video对象的实例,让它不可见(即videoview.visible = false
),并在需要时加载剪辑,并在适当的时间显示它。如果有必要,您还可以使用swapDepth()
。
AS2中的视频处理并不是最好的。请放心,你会遇到很多小问题(无间隙循环等)。
答案 3 :(得分:0)
你的方法是我通常做的,因为其他选项是将UI组件mediaDisplay包含到库中,然后使用attachMovie附加该组件,但我发现mediaDisplay我有点小错误,所以我更喜欢使用原始视频实例。
答案 4 :(得分:0)
我希望下面的代码对您非常有用:
import UTIL.MEDIA.MEDIAInstances
class Main
{
static function main() {
var MEDIAInstancesInstance :MEDIAInstances = new MEDIAInstances ();
_root.Video_Display.play ("IsothermalCompression.flv", 0);
_root.VideoDisplayMC.onPress = function() {
_root.Video_Display.seek (0);
} // _root.displayMC.onPress = function() {
} // static function main()
} // class Main
//
import UTIL.MEDIA.VideoDisplay
class UTIL.MEDIA.MEDIAInstances
{
function MEDIAInstances()
{
// depth
_root.createEmptyMovieClip ("VideoDisplayMC", 500);
//
var Video_Display:VideoDisplay
=
new VideoDisplay(_root.VideoDisplayMC, "Video_Display", 1);
Video_Display.setLocation(400, 0); Video_Display.setSize (320, 240);
//
_root.Video_Display = Video_Display; _root.VideoDisplayMC._alpha = 75;
} // MEDIAInstances()
} // class UTIL.MEDIA.MEDIAInstances
//
class UTIL.MEDIA.VideoDisplay
{
private var display:MovieClip, nc:NetConnection, ns:NetStream;
function VideoDisplay(parent:MovieClip, name:String, depth:Number)
{
display = parent.attachMovie("VideoDisplay", name, depth);
nc = new NetConnection(); nc.connect(null); ns = new NetStream(nc);
display.video.attachVideo(ns);
}
function setSize(width:Number, heigth:Number):Void
{ display.video._width = width; display.video._height = heigth;}
function setLocation(x:Number, y:Number):Void { display._x = x; display._y = y;}
public function play(url:String, bufferTime:Number):Void
{
if (bufferTime != undefined) ns.setBufferTime(bufferTime); ns.play(url);
}
//
public function pause():Void { ns.pause();}
//
public function seek(offset:Number):Void { ns.seek(offset); }
} // UTIL.MEDIA.VideoDisplay