我有来自全国各地约50位图形设计师的.swf文件,其中大部分都创建了幻灯片或视频,然后将其转换为.swf文件。
然后我将这些文件发送给另一家公司,该公司通过专有的软件为他们提供服务,该软件会查找FSCommand(ActionScript 3)来表示视频的结束。
我想创建一些简单的东西,我可以导入这些.swf文件,这些文件是他们从设计师处接收到的,这些文件会将FSCommand添加到视频的最后一帧,然后再次将文件重新导出为.swf,因为我经常穿没有源.fla文件可以使用。
我的想法是创建一个简单的网络应用程序,它将为他们这样做,我的问题是我不太了解.swf格式(或已经能够在线找到正确的信息)如何这样做。
希望有人知道如何在PHP或Ruby中执行上述操作,如果已有可以执行此操作的应用程序,或者您对如何完成此任务有更好的了解。我不是要求别人为我写任何东西,只要在正确的方向上推动就会有所帮助。
答案 0 :(得分:0)
这可能不是你想要的方式,但我会试一试,因为这是一种使用ByteArray
将SWF嵌入另一个SWF的巧妙方法。您将可以访问时间轴和函数addFrameScript,它允许您在SWF中的帧上添加回调函数。编译新SWF时,它将嵌入原始SWF并将脚本添加到调用函数lastFrameHandler
的最后一帧。
重要的是这个:
_animation.addFrameScript(_animation.totalFrames - 1, lastFrameHandler);
>
package
{
import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;
import mx.core.ByteArrayAsset;
[SWF( frameRate="30", backgroundColor="#FFFFFF", width="500", height="500" )]
public class TestDecorator extends MovieClip
{
[Embed(source = 'bin-debug/animation.swf', mimeType="application/octet-stream")]
public static const EmbeddedAnimation : Class;
private var _loader : Loader;
private var _asset : ByteArrayAsset;
private var _animation : MovieClip;
public function TestDecorator()
{
super();
// create asset
_asset = new EmbeddedAnimation();
// load bytes
_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.INIT, onLoadCompleteHandler);
_loader.loadBytes(_asset);
}
private function onLoadCompleteHandler(event : Event) : void
{
// remove listener
_loader.contentLoaderInfo.removeEventListener(Event.INIT, onLoadCompleteHandler);
// create asset as MovieClip
_animation = MovieClip(_loader.content);
// add a script that executes on the last frame
_animation.addFrameScript(_animation.totalFrames - 1, lastFrameHandler)
// add to displaylist
addChild(_animation);
}
private function lastFrameHandler() : void
{
// add your fscommand here
// fscommand(*)
}
override public function play() : void
{
_animation.play();
}
override public function stop() : void
{
_animation.stop();
}
override public function get totalFrames() : int
{
return _animation.totalFrames;
}
override public function get currentFrame() : int
{
return _animation.currentFrame;
}
}
}
答案 1 :(得分:0)
关闭一个旧线程。
对于其他人,我无法解决这个问题。我们最终联系了设计师并让他们在最后添加命令。