将flash视频输出捕获到mp4文件的脚本化方式



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

每个视频都有相同的格式:电影本身是800像素宽乘600像素高。底部60像素被一个带有播放按钮、scrubber等的控制栏占据。我不想捕捉这个(因为mp4播放器会添加自己的控件):我只想捕捉顶部540像素。每个flash视频都有一个xml文件,我可以从中抓取flash电影的持续时间,这样我就可以将电影的持续期传递给录制的任何人。

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

  • 读取下一个index.html文件的位置
  • 用chrome(或者某种无头浏览器)打开它
  • 运行*something*,执行以下操作:
    • 按下视频上的"播放"按钮,为了便于讨论,可以说它总是在坐标"30570"处
    • 开始录制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,以防相关。

获取gnash:

git克隆git://git.sv.gnu.org/gnash.git

在构建它之前,你需要一堆依赖项(应该能够很容易地获得所有依赖项):

libsdllibboostlibagg

然后配置并构建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.wav(音轨)的速度写出/tmp/out.raw(即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需要知道色彩空间(rgb32)、尺寸和输入fps。我们告诉它组合音频(160kbps mp3),以每秒30帧的速度渲染视频。

我假设"Flash Movies"指的是由播放头控制的Flash动画,而不是由播放头控制的FLV视频文件。

我怀疑JavaScript是否能够做到这一点。根据我的经验,如果你想阅读SWF内容(特别是捕捉SWF图像内容),最简单的方法是使用容器Flash脚本/应用程序。

这个答案将解释如何获取加载的Flash并从中捕获图像数据(您需要Flash Professional来实现此解决方案。免费试用版应适合您)。

您将能够指定要捕获的尺寸。有关详细信息,请参阅BitmapData上的Adobe参考资料。

您需要控制动画,以便给捕获器脚本时间来读取/写入数据。值得庆幸的是,因为您使用的是Flash/SWFLoader,所以您可以读取加载的Flash中的帧数,还可以控制播放。

然后,从BitmapData系列输出未压缩的视频,这在本答案中得到了解决。

我假设您可以访问一个工具,该工具将获取未压缩视频的整个文件夹,并将其转换为不同的格式。如果没有,有很多免费和商业程序可供选择,它们将是你完成这项任务的最佳方法(而不是自己用Flash编写视频编码脚本,我向你保证这不会很容易)

如果您的文件托管在网络上,那么客户端语言(JavaScript)对您将毫无用处。您将需要一种服务器端语言(例如PHP)来收集所有文件位置并为客户端显示它们。

我建议编写一个PHP脚本,它可以生成一个XML文件,列出文件夹(和所有子目录)中的所有SWF位置,并让Flash读取生成的XML文件,这样它就知道要调用哪些URL。如果你需要帮助,我建议你提出一个单独的问题。

最新更新