Преобразование сжатого swf в mp4
Я ищу пакетный пакет script для преобразования swf в mp4 без потерь. Я пытался использовать как ffmpeg, так и ручной тормоз, но, видимо, swf сжат, и я не могу их преобразовать.
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
HandBrakeCLI -i source -o destination
Я знаю, что я использую такой инструмент, как xilisoft, но у меня более 3000 видеороликов, и вам нужно будет запускать это автоматически. Есть ли алгоритм script/, который может помочь мне автоматизировать этот процесс?
Ответы
Ответ 1
Получить gnash:
git clone git://git.sv.gnu.org/gnash.git
Вам понадобится куча зависимостей, прежде чем вы сможете ее построить (должен быть способен apt-получить их все):
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/[email protected] \
-A /tmp/out.wav \
-P "FlashVars=myURL=http://example.com/blah&online=true" \
http://example.com/blah/some.swf \
Это выведет /tmp/out.raw
(это bgra aka rgb32 video) со скоростью 30 кадров в секунду (бит @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 должно знать размеры colourspace (rga32) и входные fps. Мы говорим, что он объединяет аудио (160 кбит/с mp3), выводит видео на 30 кадров в секунду
Для получения без потерь mp4 вам понадобятся дополнительные флаги.
Ответ 2
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
Ответ 3
Вы можете использовать этот script:
#!/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
Работает для меня!
Ответ 4
Я просто хотел бы сказать, что нет надежного способа конвертировать SWF в MP4. Потому что SWF файл это вообще программа. В простейшем случае SWF файл содержит только видео (и аудио тоже). Решения, предоставленные jaygooby, Альфредом и Алексеем Концевичем, отлично работают в таких случаях.
Но многие SWF файлы содержат собственные кнопки Play/Pause, регулятор громкости и т.д. Когда вы открываете такой файл в Gnash (или любом другом плеере), который вам нужен чтобы выполнить дополнительное действие (например, нажмите на встроенную кнопку Play), чтобы действительно начать играть. Да, это можно каким-то образом автоматизировать (например, Xvfb
, xdotool
и т.д.). В то же время есть много предостережений (особенно аудиопоток). Я даже написал статью о таком подходе (что по-русски).
PS1 Пожалуйста, не рассматривайте этот ответ и последнюю ссылку как рекламу моего сайта.
PS2 Этот материал должен идти как комментарий. Но он опубликован как ответ из-за текстового формата.