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?

297
demandé sur Michael Currie 2010-10-15 00:44:09

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 .

506
répondu Alexy 2016-02-19 11:52:43

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.

76
répondu rwilliams 2016-02-19 11:55:30

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
73
répondu Rodrigo Polo 2015-07-28 18:05:43

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
16
répondu Zonjai 2013-07-02 00:45:36
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

11
répondu nano 2011-09-16 02:27:31

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.

11
répondu Bijou Trouvaille 2014-04-11 06:05:20

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.

6
répondu sabujp 2013-09-04 21:50:39

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
3
répondu David Costa Faidella 2013-11-04 23:59:39

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
2
répondu smoyth 2013-10-19 19:48:59

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é.

1
répondu ldig 2011-09-24 22:14:04