将Flash视频输出捕获到mp4文件的可编写脚本的方法?

时间:2014-01-02 12:40:32

标签: javascript video flash mp4

我有大量的flash动画需要转换为mp4文件才能使它们与ios兼容。每部电影都有一个基本的html文件(全称为index.html),它将打开swf,设置适当的参数以使其运行。

每个视频都具有相同的格式:电影本身是800px宽,600px高。底部60像素被一个带有播放按钮,擦洗器等的控制条占用。我想要捕获它(因为mp4播放器将添加自己的控件):我只想捕获顶部540px。每个flash视频都有一个读入的xml文件,我可以从中扫描flash电影的持续时间,这样我就可以将电影的持续时间传递给录制的任何内容。

我在linux中,我想编写一个执行以下操作的脚本:

  • 读取下一个index.html文件的位置
  • 以chrome(或某种无头浏览器)打开它
  • 运行* 某些 *执行以下操作:
    • 按下视频上的“播放”按钮,为了参数,我们可以说总是在坐标“30,570”
    • 开始录制视频和音频X秒,其中X从我的脚本传递。
    • 在X秒后,停止录制,并将输出作为mp4文件保存到我的文件系统上的指定位置。

比方说,作为一个例子,对于第一个视频,我有这些参数,我可以通过任何工具来做到这一点:

{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。

2 个答案:

答案 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。如果你需要帮助,我建议你提出一个单独的问题。