ffmpeg flash mp4 video-conversion

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