27

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

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

HandBrakeCLI -i source -o destination

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

4

4 回答 4

27

咬牙切齿:

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

在构建它之前,您需要一堆依赖项(应该能够全部获取):

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(位)写出/tmp/out.raw(bgra aka rgb32 视频)和@30/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)尺寸和输入 fps。我们告诉它合并音频(160kbps mp3),以 30fps 的速度渲染视频

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

于 2014-01-09T14:36:01.653 回答
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
于 2014-10-16T12:27:17.543 回答
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

为我工作!

于 2016-09-03T07:29:02.737 回答
3

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

但是许多 SWF 文件包含它们自己的播放/暂停按钮、音量控制等。当您在Gnash(或任何播放器)中打开此类文件时,您需要执行其他操作(例如,单击嵌入式播放按钮)以真的开始玩了。是的,可以以某种方式(例如,等)自动化这些Xvfb东西xdotool。同时那里有很多警告(尤其是音频流)。我什至写了一篇关于这种方法的文章(用俄语写的)。


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

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

于 2017-05-06T13:41:12.657 回答