AS3 - 嵌入式SWF视频显示totalFrames == 0

时间:2010-08-13 21:50:01

标签: actionscript-3 video flash embed movieclip

我有这部长达1分钟的电影要编译成AS3项目。电影以MOV格式开始,因此我使用FFMpeg将其转换为FLV,然后再使用FFMpeg将其从FLV转换为SWF。

我正在使用Embed元数据将此电影嵌入到AS3二进制文件中:

[Embed(source="1.swf")]
private var _Vid:Class;

我有一个容器Sprite,可以添加这部电影。在添加之前,我将嵌入的电影转换为MovieClip:

var vid:Object = new _Vid();
return vid as MovieClip;

当我将生成的影片剪辑添加到舞台时,它立即开始播放并且似乎播放正常。但是,当我检查影片剪辑的totalFrames属性时,它返回0.并且影片剪辑似乎不响应对stopgotoAndStop的调用。

我通过在Flash IDE中将电影嵌入到SWF中然后以相同的方式嵌入结果来获得相同的行为,所以看起来某些事情与我将它添加到舞台的方式完全没有关系。有什么想法吗?

编辑:作为产品的要求,as3电影无法从外部文件加载视频。它必须被编译,因此执行播放的结果.swf可以完全独立运行,而不必依赖其他外部文件。

编辑2:进一步检查后,由以下内容产生的MovieClip实例

[Embed(source="1.swf")]
private var _Vid:Class;
var vid:Object = new _Vid();
return vid as MovieClip;

有一个子对象属于Loader类,该子对象没有子对象。我尝试将孩子直接作为MovieClip投射,但无济于事。

编辑3:从我正在阅读的herehere开始,NetStream对象的10.1 api公开了一个名为appendBytes的方法。我仍然需要进一步研究这个问题,但我可以将.flv文件作为八位字节流嵌入,并将字节手动输入到Net Stream对象以播放视频。我会将测试结果发布在几个......

2 个答案:

答案 0 :(得分:3)

我最终将视频嵌入为二进制数据:

[Embed(source="1004.flv", mimeType="application/octet-stream")]

然后使用NetStream.appendBytes()将视频提供给连接到Video对象的NetStream。这非常有效,NetStream可以暂停和重放。

答案 1 :(得分:1)

查看这些教程

http://gotoandlearn.com/play.php?id=46

http://gotoandlearn.com/play.php?id=129

我认为,如果将视频嵌入到MovieClip中,那么您可以期待的唯一行为就是您现在所获得的内容。它会播放但你无法控制它。

为什么你坚持要嵌入它?它会使你的文件变大,直到swf完全加载后视频才会播放。这是一个简短的视频,但它仍然需要比通过渐进式下载访问它更长的时间。

不可否认,第二个教程没有太多相关性,但为什么不添加它,它为您提供了更多关于如何处理Flash中媒体的范围。 OSMF是一个新的框架,我认为了解它是有意义的。