web-dev-qa-db-ja.com

圧縮されたswfをmp4に変換する

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以上のビデオがあり、これを自動的に実行する必要があります。このプロセスを自動化するのに役立つスクリプト/アルゴリズムはありますか?

18
skmvasu

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を取得するには、追加のフラグが必要です。

21
jaygooby
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
9
Alfred

次のスクリプトを使用できます。

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

SWFをMP4に変換する信頼できる方法はないと言いたいです。一般に、SWFファイルはプログラムであるためです。最も単純な場合、SWFファイルにはビデオ(およびオーディオ)のみが含まれます。 jaygoobyAlfred 、および Aleksey Kontsevich によって提供されるソリューションは、このような場合に完全に機能します。

ただし、多くのSWFファイルには独自のPlay/Pauseボタン、volumeコントロールなど。Gnash(または他のプレイヤー)でこのようなファイルを開く場合、追加のアクションを実行する必要があります、実際に再生を開始するには、埋め込みPlayボタンをクリックします。はい、何らかの方法でこのようなものを自動化することが可能です(例:Xvfbxdotoolなど)。同時に、多くの注意事項があります(特にオーディオストリーム)。私も そのようなアプローチに関する記事 (それはロシア語です)と書きました。


PS1この回答と後者のリンクを私のサイトの広告と考えないでください。

PS2このようなものはコメントとして行ってください。ただし、テキスト形式のため、回答として公開されています。

2
flaz14