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以上のビデオがあり、これを自動的に実行する必要があります。このプロセスを自動化するのに役立つスクリプト/アルゴリズムはありますか?
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
その後、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
(rgb32ビデオとも呼ばれるbgra)が書き出されます。
これらを再結合する必要があります使用して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を取得するには、追加のフラグが必要です。
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
次のスクリプトを使用できます。
#!/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
私のために働く!
SWFをMP4に変換する信頼できる方法はないと言いたいです。一般に、SWFファイルはプログラムであるためです。最も単純な場合、SWFファイルにはビデオ(およびオーディオ)のみが含まれます。 jaygooby 、 Alfred 、および Aleksey Kontsevich によって提供されるソリューションは、このような場合に完全に機能します。
ただし、多くのSWFファイルには独自のPlay/Pauseボタン、volumeコントロールなど。Gnash(または他のプレイヤー)でこのようなファイルを開く場合、追加のアクションを実行する必要があります、実際に再生を開始するには、埋め込みPlayボタンをクリックします。はい、何らかの方法でこのようなものを自動化することが可能です(例:Xvfb
、xdotool
など)。同時に、多くの注意事項があります(特にオーディオストリーム)。私も そのようなアプローチに関する記事 (それはロシア語です)と書きました。
PS1この回答と後者のリンクを私のサイトの広告と考えないでください。
PS2このようなものはコメントとして行ってください。ただし、テキスト形式のため、回答として公開されています。