Je cherche un script batch pour convertir swf en mp4, sans perte. J'ai essayé d'utiliser à la fois ffmpeg et handbrake, mais apparemment swf est compressé et je ne peux pas les convertir de cette façon.
ffmpeg -i input -c:v libx264 -preset ultrafast -qp 0 output.mkv
HandBrakeCLI -i source -o destination
Je sais que j'utilise un outil comme xilisoft, mais j'ai plus de 3000 vidéos et je devrais l'exécuter automatiquement. Existe-t-il un script/algorithme qui peut m'aider à automatiser ce processus?
Obtenez grincement:
git clone git://git.sv.gnu.org/gnash.git
Vous aurez besoin d'un tas de dépendances avant de pouvoir le construire (devrait être capable de les obtenir toutes):
libsdl-dev
libboost-dev
libagg-dev
Ensuite, configurez et construisez le dumper vidéo gnash:
cd gnash
./autogen.sh
./configure --enable-renderer=agg \
--enable-gui=dump \
--disable-menus \
--enable-media=ffmpeg \
--disable-jemalloc
make
vous pouvez ensuite pointer dump-gnash sur un swf et il restituera la vidéo et l'audio brutes
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 \
Cela écrira /tmp/out.raw
(qui est la vidéo bgra aka rgb32) à 30 ips (le @30
bit) et /tmp/out.wav
Ceux-ci doivent être combinés, par exemple, mp4 utilisant:
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
parce que sa vidéo brute, ffmpeg doit connaître les dimensions de l'espace chromatique (rga32) et les fps d'entrée. Nous lui disons de combiner l'audio (mp3 160kbps), de restituer la vidéo à 30fps
Vous aurez besoin de drapeaux supplémentaires pour obtenir le mp4 sans perte.
OS: Ubuntu (Linux)
Je ne sais pas exactement si c'est sans perte mais au moins j'ai réussi à faire fonctionner la partie convert (ffmpeg).
Sudo apt-get install ffmpeg swftools
J'ai d'abord décompressé en utilisant swfcombine :
swfcombine -d file.swf -o file_new.swf
Ensuite, j'ai converti en utilisant ffmpeg qui pourrait ne pas être sans perte avec ces paramètres
ffmpeg -i file.swf video.mp4
Vous pouvez utiliser ce 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
Travaille pour moi!
Je voudrais juste dire qu'il n'y a pas de moyen fiable pour convertir SWF en MP4. Parce que le fichier SWF est un programme en général. Dans le cas le plus simple, le fichier SWF ne contient que de la vidéo (et de l'audio également). Les solutions fournies par jaygooby , Alfred et Aleksey Kontsevich fonctionnent parfaitement dans de tels cas.
Mais de nombreux fichiers SWF contiennent leurs propres boutons Lecture / Pause , contrôles de volume , etc. Lorsque vous ouvrez un tel fichier dans Gnash (ou n'importe quel lecteur), vous devez effectuer une action supplémentaire ( par exemple, cliquez sur un bouton de lecture intégré ) pour vraiment commencer à jouer. Oui, il est possible d'automatiser ce genre de choses d'une certaine manière (par exemple Xvfb
, xdotool
, etc.). En même temps, il y a beaucoup de mises en garde (en particulier le flux audio). J'ai même écrit n article sur une telle approche (c'est en russe).
PS1 Veuillez ne pas considérer cette réponse et ce dernier lien comme une publicité pour mon site.
PS2 Ce truc devrait aller comme commentaire. Mais il est publié comme réponse en raison du format texte.