Vidéos tournantes avec FFmpeg
j'ai essayé de comprendre comment tourner des vidéos avec FFmpeg. Je travaille avec des vidéos iPhone prises en mode portrait. Je sais comment déterminer les degrés actuels de rotation en utilisant MediaInfo (excellente bibliothèque, btw) mais je suis coincé sur FFmpeg maintenant.
D'après ce que j'ai lu, ce que vous devez utiliser est une option vfilter . Selon ce que je vois, il devrait ressembler à ceci:
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
Cependant, je ne peux pas obtenir que cela fonctionne. Tout d'abord, - vfilters n'existe plus, il est maintenant juste - vf . Deuxièmement, je reçois cette erreur:
No such filter: 'rotate'
Error opening filters!
pour autant que je sache, J'ai une version tout-en-options de FFmpeg. L'exécution ffmpeg-filtres montre ceci:
Filters:
anull Pass the source unchanged to the output.
aspect Set the frame aspect ratio.
crop Crop the input video to x:y:width:height.
fifo Buffer input images and send them when they are requested.
format Convert the input video to one of the specified pixel formats.
hflip Horizontally flip the input video.
noformat Force libavfilter not to use any of the specified pixel formats
for the input to the next filter.
null Pass the source unchanged to the output.
pad Pad input image to width:height[:x:y[:color]] (default x and y:
0, default color: black).
pixdesctest Test pixel format definitions.
pixelaspect Set the pixel aspect ratio.
scale Scale the input video to width:height size and/or convert the i
mage format.
slicify Pass the images of input video on to next video filter as multi
ple slices.
unsharp Sharpen or blur the input video.
vflip Flip the input video vertically.
buffer Buffer video frames, and make them accessible to the filterchai
n.
color Provide an uniformly colored input, syntax is: [color[:size[:ra
te]]]
nullsrc Null video source, never return images.
nullsink Do absolutely nothing with the input video.
ayant les options pour vflip et hflip ils sont super, mais ils ne me mèneront pas là où j'ai besoin d'aller. J'ai besoin de la capacité de tourner des vidéos à 90 degrés au minimum. 270 degrés serait une excellente option. Où sont passées les options de rotation?
10 réponses
tourner 90 dans le sens des aiguilles d'une montre:
ffmpeg -i in.mov -vf "transpose=1" out.mov
pour le paramètre de transposition vous pouvez passer:
0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip
utilisez -vf "transpose=2,transpose=2"
pour 180 degrés.
assurez-vous d'utiliser une version récente de ffmpeg d'ici (une construction statique fonctionnera très bien).
notez que cela va ré-encoder les parties audio et vidéo. Vous pouvez généralement copier l'audio sans le toucher, en utilisant -c:a copy
. De changez la qualité vidéo, Réglez le débit (par exemple avec -b:v 1M
) ou jetez un oeil au H. 264 encoding guide si vous voulez des options VBR.
une solution est également d'utiliser ce convenience script .
avez-vous essayé transpose
encore? Comme de l'autre réponse)
ffmpeg -i input -vf transpose=2 output
Si vous utilisez une ancienne version, vous devez mettre à jour ffmpeg si vous souhaitez utiliser la transposition de fonctionnalité, comme il a été ajouté en octobre 2011.
FFmpeg télécharger page propose les versions statiques que vous pouvez exécuter directement sans avoir à les compiler.
si vous ne voulez pas ré-encoder votre vidéo et que votre lecteur peut gérer les métadonnées de rotation, vous pouvez simplement changer la rotation dans les métadonnées en utilisant ffmpeg:
ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v
je suis tombé sur cette page en cherchant la même réponse. Cela fait maintenant six mois que cela a été demandé à l'origine et les constructions ont été mises à jour de nombreuses fois depuis lors. Cependant, j'ai voulu ajouter une réponse pour toute autre personne qui se présente ici à la recherche de cette information.
j'utilise Debian Squeeze et la version FFmpeg de ces dépôts.
la page de manuel de ffmpeg indique l'utilisation suivante
ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg
la clé étant que vous ne devez pas utiliser une variable de degré, mais une variable de réglage prédéfinie à partir de la page de manuel.
0=90CounterCLockwise and Vertical Flip (default)
1=90Clockwise
2=90CounterClockwise
3=90Clockwise and Vertical Flip
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
ne marchera pas, même avec la dernière source...
doit changer l'ordre:
ffmpeg -i input.mp4 -vf vflip output.mp4
fonctionne très bien
pour tourner l'image dans le sens des aiguilles d'une montre, vous pouvez utiliser le filtre de rotation, indiquant un angle positif en radians. Avec 90 degrés correspondant à PI / 2, Vous pouvez le faire comme ceci:
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
dans le sens contraire des aiguilles d'une montre, l'angle doit être négatif
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
le filtre transpose fonctionnera également bien pour 90 degrés, mais pour les autres angles c'est un choix plus rapide ou seulement.
si vous obtenez un "Codec expérimental mais les codecs expérimentaux ne sont pas activés" erreur utilisez ceci:
ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile
est arrivé avec moi pour certains .fichier mov avec audio aac.
ce script qui va sortir les fichiers avec la structure de répertoire sous"fixedFiles". À l'heure actuelle est fixé aux fichiers MOV et exécutera un certain nombre de transformations en fonction de la "rotation" originale de la vidéo. Fonctionne avec iOS vidéos capturées sur un Mac Mavericks exécution, mais devrait être facilement exportable. Repose sur avoir installé à la fois exiftool et ffmpeg .
#!/bin/bash
# rotation of 90 degrees. Will have to concatenate.
#ffmpeg -i <originalfile> -metadata:s:v:0 rotate=0 -vf "transpose=1" <destinationfile>
#/VLC -I dummy -vvv <originalfile> --sout='#transcode{width=1280,vcodec=mp4v,vb=16384,vfilter={canvas{width=1280,height=1280}:rotate{angle=-90}}}:std{access=file,mux=mp4,dst=<outputfile>}\' vlc://quit
#Allowing blanks in file names
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
#Bit Rate
BR=16384
#where to store fixed files
FIXED_FILES_DIR="fixedFiles"
#rm -rf $FIXED_FILES_DIR
mkdir $FIXED_FILES_DIR
# VLC
VLC_START="/Applications/VLC.app/Contents/MacOS/VLC -I dummy -vvv"
VLC_END="vlc://quit"
#############################################
# Processing of MOV in the wrong orientation
for f in `find . -regex '\./.*\.MOV'`
do
ROTATION=`exiftool "$f" |grep Rotation|cut -c 35-38`
SHORT_DIMENSION=`exiftool "$f" |grep "Image Size"|cut -c 39-43|sed 's/x//'`
BITRATE_INT=`exiftool "$f" |grep "Avg Bitrate"|cut -c 35-38|sed 's/\..*//'`
echo Short dimension [$SHORT_DIMENSION] $BITRATE_INT
if test "$ROTATION" != ""; then
DEST=$(dirname ${f})
echo "Processing $f with rotation $ROTATION in directory $DEST"
mkdir -p $FIXED_FILES_DIR/"$DEST"
if test "$ROTATION" == "0"; then
cp "$f" "$FIXED_FILES_DIR/$f"
elif test "$ROTATION" == "180"; then
# $(eval $VLC_START \"$f\" "--sout="\'"#transcode{vfilter={rotate{angle=-"$ROTATION"}},vcodec=mp4v,vb=$BR}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
$(eval ffmpeg -i \"$f\" -vf hflip,vflip -r 30 -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\")
elif test "$ROTATION" == "270"; then
$(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=2,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )
else
# $(eval $VLC_START \"$f\" "--sout="\'"#transcode{scale=1,width=$SHORT_DIMENSION,vcodec=mp4v,vb=$BR,vfilter={canvas{width=$SHORT_DIMENSION,height=$SHORT_DIMENSION}:rotate{angle=-"$ROTATION"}}}:std{access=file,mux=mp4,dst=\""$FIXED_FILES_DIR/$f"\"}'" $VLC_END )
echo ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\"
$(eval ffmpeg -i \"$f\" -vf "scale=$SHORT_DIMENSION:-1,transpose=1,pad=$SHORT_DIMENSION:$SHORT_DIMENSION:\(ow-iw\)/2:0" -r 30 -s "$SHORT_DIMENSION"x"$SHORT_DIMENSION" -metadata:s:v:0 rotate=0 -b:v "$BITRATE_INT"M -vcodec libx264 -acodec copy \"$FIXED_FILES_DIR/$f\" )
fi
fi
echo
echo ==================================================================
sleep 1
done
#############################################
# Processing of AVI files for my Panasonic TV
# Use ffmpegX + QuickBatch. Bitrate at 16384. Camera res 640x424
for f in `find . -regex '\./.*\.AVI'`
do
DEST=$(dirname ${f})
DEST_FILE=`echo "$f" | sed 's/.AVI/.MOV/'`
mkdir -p $FIXED_FILES_DIR/"$DEST"
echo "Processing $f in directory $DEST"
$(eval ffmpeg -i \"$f\" -r 20 -acodec libvo_aacenc -b:a 128k -vcodec mpeg4 -b:v 8M -flags +aic+mv4 \"$FIXED_FILES_DIR/$DEST_FILE\" )
echo
echo ==================================================================
done
IFS=$SAVEIFS
la réponse D'Alexy a presque fonctionné pour moi sauf que je recevais cette erreur:
timebase 1/90000 non supporté par la norme MPEG 4, le maximum la valeur admise pour le dénominateur de la base de temps est 65535
j'ai juste dû ajouter un paramètre (-r 65535/2733) à la commande et cela a fonctionné. La commande complète était ainsi:
ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4
malheureusement, la version Ubuntu de ffmpeg ne supporte pas les videofilters.
vous devez utiliser avidemux ou un autre éditeur pour obtenir le même effet.
de manière programmatique, mencoder a été recommandé.