我有大量的flash动画需要转换为mp4文件才能使它们与ios兼容。每部电影都有一个基本的html文件(全称为index.html),它将打开swf,设置适当的参数以使其运行。
每个视频都具有相同的格式:电影本身是800px宽,600px高。底部60像素被一个带有播放按钮,擦洗器等的控制条占用。我不想要捕获它(因为mp4播放器将添加自己的控件):我只想捕获顶部540px。每个flash视频都有一个读入的xml文件,我可以从中扫描flash电影的持续时间,这样我就可以将电影的持续时间传递给录制的任何内容。
我在linux中,我想编写一个执行以下操作的脚本:
比方说,作为一个例子,对于第一个视频,我有这些参数,我可以通过任何工具来做到这一点:
{url: "localhost:3000/my_video_input/1/index.html", duration: 250, output_file:"/home/max/my_video_output/1/video.mp4"}
有人可以指点一个工具,或者也许是一个javascript库,这样做吗?也许解决方案涉及在将javascript文件加载到浏览器之前将其编写到html文件中。如果是这样那么这是可行的,但我更喜欢更简单的东西:)
提前感谢 - 最多
编辑 - 更多信息。如果相关,Flash应用程序是as2而不是as3。
答案 0 :(得分:3)
获取gnash:
git clone git://git.sv.gnu.org/gnash.git
在构建它之前你需要一堆依赖项(应该能够apt-get all):
libsdl libboost libagg
然后配置并构建gnash(开源Flash播放器)视频转储程序:
cd gnash
./autogen.sh
./configure --enable-renderer=agg \
--enable-gui=dump \
--disable-menus \
--enable-media=ffmpeg \
--disable-jemalloc
make
然后你可以将dump-gnash
指向一个swf,它将呈现原始视频和音频
dump-gnash -1 \
-D /tmp/out.raw@30 \
-A /tmp/out.wav \
-P "FlashVars=myURL=http://example.com/blah&online=true" \
http://example.com/blah/some.swf
这将以30fps(@ 30位)和/tmp/out.raw
(音轨)写出/tmp/out.wav
(即bgra aka rgb32视频)。
这些需要重新组合到例如mp4使用:
ffmpeg -i /tmp/out.wav \
-f rawvideo \
-pix_fmt rgb32 \
-s:v 800x550 \
-r 30 \
-i /tmp/out \
-c:v libx264 \
-r 30 \
-b 160k \
/tmp/out.mp4
因为它是原始视频,ffmpeg需要知道colourspace(rgb32),尺寸和输入fps。我们告诉它要结合音频(160kbps mp3),以30fps的速度渲染视频。
答案 1 :(得分:1)
我将假设'Flash Movies'是指由播放头控制的Flash动画,而不是由播放头控制的FLV视频文件。
我怀疑JavaScript是否能够做到这一点。根据我的经验,如果您想阅读SWF内容(特别是捕获SWF图像内容),最简单的方法是使用容器Flash脚本/应用程序。
This answer将解释如何获取加载的Flash并从中捕获图像数据(您需要Flash Professional来实现此解决方案。免费试用版应该适合您)。
您将能够指定要捕获的尺寸。有关详细信息,请参阅Adobe reference on BitmapData。
您需要控制动画,以便为捕获器脚本提供读/写数据的时间。值得庆幸的是,因为您使用的是Flash / SWFLoader,您可以读取加载的Flash中的帧数,并控制播放。
然后,输出来自BitmapData系列的未压缩视频,该视频在this answer中解决。
我将假设您可以访问一个工具,该工具将获取整个未压缩视频文件夹并将其转换为其他格式。如果没有,有很多免费和商业程序可用于此,它们将是您完成此任务的最佳方法(而不是自己在Flash中编写视频编码脚本,我保证您不会轻松)
如果您的文件托管在网络上,那么客户端语言(JavaScript)将对您毫无用处。您将需要一种服务器端语言(例如PHP)来收集所有文件位置并为客户端显示它们。
我建议编写一个PHP脚本,它创建一个XML文件,列出文件夹(以及所有子目录)中的所有SWF位置,并让Flash读取生成的XML文件,以便它知道要调用哪些URL。如果你需要帮助,我建议你提出一个单独的问题。