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