将压缩的swf转换为mp4

时间:2013-11-25 13:26:04

标签: ffmpeg flash mp4 video-conversion

我正在寻找一个批处理脚本来将swf转换为mp4,无损。我尝试使用ffmpeg和handbrake,但显然swf是压缩的,我无法通过这种方式转换它们。

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

HandBrakeCLI -i source -o destination

我知道我使用像xilisoft这样的工具,但我有超过3000个视频,需要自动运行。是否有可以帮助我自动完成此过程的脚本/算法?

4 个答案:

答案 0 :(得分:20)

获取gnash:

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

在构建它之前你需要一堆依赖项(应该能够apt-get all):

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

然后你可以在swf上指向dump-gnash,它会渲染原始视频和音频

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(/tmp/out.raw位)和@30

写出/tmp/out.wav(也就是bgra又名rgb32视频)

这些需要重新组合到例如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需要知道colourspace(rga32)维度和输入fps。我们告诉它结合音频(160kbps mp3),以30fps的速度渲染视频

你需要额外的标志来获得无损mp4。

答案 1 :(得分:8)

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

答案 2 :(得分:3)

您可以使用此脚本:

#!/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

适合我!

答案 3 :(得分:2)

我只想说没有可靠的方法将SWF转换为MP4。因为SWF文件一般是一个程序。在最简单的情况下,SWF文件仅包含视频(以及音频)。 jaygoobyAlfredAleksey Kontsevich提供的解决方案在这种情况下非常有效。

但是许多SWF文件包含他们自己的播放 / 暂停按钮,音量控件等。当您在 Gnash (或任何玩家)您需要执行其他操作(例如,点击嵌入式播放按钮)才能真正开始播放。是的,可以通过某种方式自动化这些内容(例如Xvfbxdotool等)。与此同时,有很多警告(特别是音频流)。我甚至写了an article about such approach(对不起,那是俄文)。

PS1 请不要将此答案和后一个链接视为我网站的广告。

PS2 这个东西应该作为评论。但由于文本格式,它作为答案发布。