将压缩的swf转换为mp4

27

我正在寻找一种批处理脚本,将SWF转换为无损的MP4格式。我尝试过使用FFmpeg和Handbrake,但显然SWF是压缩的,我不能以这种方式进行转换。

ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv

HandBrakeCLI -i source -o destination

我知道我可以使用像 Xilisoft 这样的工具,但是我有超过 3000 个视频需要自动处理。是否有脚本/算法可以帮助我自动化这个过程?


1
嗨,你最终解决了这个问题吗?谢谢。 - Max Williams
Max- 暂时还没有运气。现在我已经从供应商那里购买了另一个版本。 - skmvasu
好的,谢谢!<padding></padding> - Max Williams
我猜可能有点晚了,但我想我找到了如何做到这一点的方法。我稍后会提供一个答案。 - Alfred
4个回答

27

获取Gnash:

git clone git://git.sv.gnu.org/gnash.git

在构建之前,您需要许多依赖项(应该都可以使用apt-get获取):

libsdl-dev
libboost-dev
libagg-dev

然后配置并构建Gnash视频转储程序:

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(即bgra或rgb32视频)和/tmp/out.wav写出。

这些需要使用以下命令重新组合成例如mp4:

ffmpeg -i /tmp/out.wav \
       -f rawvideo \
       -pix_fmt rgb32 \
       -s:v 800x550 \
       -r 30 \
       -i /tmp/out.raw \
       -c:v libx264 \
       -r 30 \
       -b 160k \
       /tmp/out.mp4
因为这是原始视频,ffmpeg需要知道色彩空间(rga32)的尺寸和输入帧速率。我们告诉它将音频(160kbps mp3)合并,以30fps再次渲染视频。
要获得无损mp4,您需要额外的标志。

可能有各种原因;您知道该swf是使用AS2还是AS3构建的吗?我曾经遇到过一些问题,其中一个背景没有渲染,因为一个swf正在加载另一个swf,而电影是两者的组合,gnash并不总是正确处理这个问题。 - jaygooby
Gnash现在为Debian类型添加了依赖项安装程序:deb-attempt-install-dependencies.sh。 - Ken J
1
我无法在Mac上编译这个工具。我一直收到编译错误。 - khatchad
感谢http://stackoverflow.com/users/102250/jan-larres提供的有关缺少.raw的建议编辑。由于一些审阅者过于热心地拒绝了编辑,我无法批准该编辑。 - jaygooby
嗨,我刚刚使用了这个。我不得不使用“-b:a”来指定“-b”选项适用于音频。我还替换了第二个“-r”为“-r:a”,以防万一,但也许不需要。 - Alberto González Palomo
显示剩余3条评论

11
OS: Ubuntu (Linux)

我不确定这是否是无损的,但至少我已经使转换部分(使用ffmpeg)工作了。

依赖项

sudo apt-get install ffmpeg swftools

解压缩

首先,我使用swfcombine进行解压缩:

swfcombine -d file.swf -o file_new.swf

转换

接下来我使用了ffmpeg进行转换,但这些参数可能不是无损的。

ffmpeg -i file.swf video.mp4

这个可以工作,但是不会呈现/忽略通过swfcombine添加的新资产,如http://marc.info/?l=swftools-common&m=138732909815669&w=2所述 - 你有任何想法如何确保新图像不被忽略吗? - mika
4
视频对我来说很模糊。 - khatchad
对我来说,使用sudo apt-get install libav-tools可以正常工作,而不是上面显示的方式。 - nightcod3r

4
您可以使用此脚本:
#!/bin/bash

SWFFILE=$1
MP4FILE=${SWFFILE%.*}.mp4
TMPFILE=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).bin
TMPWAV=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).wav
TMPMP4=$(cat /dev/urandom | tr -dc 'a-zA-Z' | fold -w 32 | head -n 1).mp4

# create raw-dump
GNASHCMD="dump-gnash -1 -r 3 -v -D $TMPFILE -A $TMPWAV $SWFFILE"
OUTPUT="$(exec $GNASHCMD)"

# extract parameters
WIDTH="$(echo $OUTPUT | grep -o 'WIDTH=[^, }]*' | sed 's/^.*=//')"
HEIGHT="$(echo $OUTPUT | grep -o 'HEIGHT=[^, }]*' | sed 's/^.*=//')"
FPS="$(echo $OUTPUT | grep -o 'FPS_ACTUAL=[^, }]*' | sed 's/^.*=//')"

# create raw, uncompressed mp4 file
mplayer $TMPFILE -vo yuv4mpeg:file=$TMPMP4 -demuxer rawvideo -rawvideo fps=$FPS:w=$WIDTH:h=$HEIGHT:format=bgra

# create compressed mp4 with ffmpeg
ffmpeg -i $TMPMP4 -i $TMPWAV $MP4FILE

# clean up
rm -rf $TMPFILE
rm -rf $TMPMP4
rm -rf $TMPWAV

我的工作正常运行!


我必须在ffmpeg的输出之前添加“-strict -2”。由于swf中的循环,我还必须手动设置--max-advances以处理一堆文件。除此之外,这个方法非常有效。 - Kayot
感谢提供脚本。我试图转换一个17MB的SWF文件,但它占用了大量的磁盘空间,已经耗尽了22GB的空间,但仍未完成。是否出现了问题? - Bishnu
1
@Bishnu 尝试使用h264或265编码器压缩mp4文件。很久没有使用这个脚本了,请查看ffmpeg开关。 - Aleksey Kontsevich
谢谢。我真的很无助,而且我没有安装mplayer。我使用最基本的slack软件包,并且我的空间已经用完了,因为我安装了xurlrunner。 - Bishnu

3
我只想说,没有可靠的方法将SWF转换为MP4,因为SWF文件通常是一个程序。在最简单的情况下,SWF文件仅包含视频(以及音频)。在这种情况下,由jaygoobyAlfredAleksey Kontsevich提供的解决方案效果非常好。
但是,许多SWF文件包含它们自己的播放/暂停按钮、音量控制等功能。当你在Gnash(或其他播放器)中打开这样的文件时,你需要执行额外的操作(例如,点击嵌入的“播放”按钮)才能真正开始播放。是的,可以用某种方式自动化这个过程(如Xvfb、xdotool等)。同时,这里有很多注意事项(特别是音频流)。我甚至写了一篇关于这种方法的文章(用俄语写的)。
PS1 请不要把这个答案和后面的链接视为我的网站的广告。
PS2 这些内容应该作为评论发布。但是由于文本格式的原因,它们被发布为答案。

我已更新URL,使其指向实际页面而非Web存档。 - flaz14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接