ffmpeg - Convertir swf comprimido a mp4
flash video-conversion (4)
Estoy buscando un script por lotes para convertir swf a mp4, sin pérdidas. Intenté usar tanto ffmpeg como handbrake, pero aparentemente swf está comprimido y no puedo convertirlos de esta manera.
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
HandBrakeCLI -i source -o destination
Sé que puedo usar una herramienta como xilisoft, pero tengo más de 3000 videos y necesitaría ejecutar esto automáticamente. ¿Hay algún script / algoritmo que pueda ayudarme a automatizar este proceso?
Obtener gnash:
git clone git://git.sv.gnu.org/gnash.git
Necesitará un montón de dependencias antes de poder construirlo (debería ser capaz de obtenerlas todas):
libsdl-dev
libboost-dev
libagg-dev
Luego configura y construye el dumper de video gnash:
cd gnash
./autogen.sh
./configure --enable-renderer=agg /
--enable-gui=dump /
--disable-menus /
--enable-media=ffmpeg /
--disable-jemalloc
make
luego puede apuntar dump-gnash a un swf y se reproducirá el video y audio en bruto
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 /
Esto escribirá /tmp/out.raw
(que es bgra aka rgb32 video) a 30 fps ( @30
bit) y /tmp/out.wav
Estos necesitan volver a combinarse en, por ejemplo, mp4 usando:
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
debido a su video sin procesar, ffmpeg necesita conocer las dimensiones del espacio de color (rga32) y los fps de entrada. Le pedimos que combine el audio (160 kbps mp3), restaure el video a 30 fps
Necesitará banderas adicionales para obtener el mp4 sin pérdida.
Puedes usar este 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
¡Funciona para mi!
Solo me gustaría decir que no hay una forma confiable de convertir SWF a MP4. Debido a que el archivo SWF es un programa en general. En el caso más simple, el archivo SWF contiene solo video (y audio también). Las soluciones proporcionadas por jaygooby , Alfred y Aleksey Kontsevich funcionan perfectamente en tales casos.
Pero muchos archivos SWF contienen sus propios botones Reproducir / Pausa , controles de volumen , etc. Cuando abre dicho archivo en Gnash (o cualquier otro jugador), necesita realizar una acción adicional (por ejemplo, hacer clic en un botón Reproducir integrado) para realmente empezar a jugar. Sí, es posible automatizar esto de alguna manera (por ejemplo, xdotool
, xdotool
, etc.). Al mismo tiempo, hay muchas advertencias allí (especialmente el flujo de audio). Incluso escribí un artículo sobre este enfoque (lo siento, está en ruso).
PS1 Por favor, no considere esta respuesta y este último enlace como un anuncio de mi sitio.
PS2 Esto debería ir como comentario. Pero se publica como respuesta por formato de texto.
OS: Ubuntu (Linux)
No sé exactamente si esto es sin pérdida, pero al menos conseguí que la parte de conversión funcionara (ffmpeg).
dependencias
sudo apt-get install ffmpeg swftools
Descomprimir
Primero me descomprimí utilizando swfcombine :
swfcombine -d file.swf -o file_new.swf
Convertir
A continuación, convertí usando ffmpeg, que podría no tener pérdidas con estos parámetros.
ffmpeg -i file.swf video.mp4