web-dev-qa-db-fra.com

Comment faire pivoter une vidéo de 180 ° avec FFmpeg?

J'ai une vidéo qui a été tournée à 180 ° lors de l'enregistrement. Est-il possible de corriger cela avec FFmpeg?

64
Louis

originalrotated


tl; dr

ffmpeg fera automatiquement pivoter la vidéo sauf si:

  • votre entrée ne contient pas de métadonnées de rotation
  • votre ffmpeg est trop vieux

Métadonnées de rotation

Certaines vidéos, telles que celles provenant d'iPhones, ne sont pas physiquement inversées, mais contiennent des données latérales displaymatrix de flux vidéo ou font pivoter des métadonnées. Certains joueurs ignorent ces métadonnées et d'autres non. Reportez-vous à la sortie de la console ffmpeg pour voir si votre entrée contient de telles métadonnées:

$ ffmpeg -i input.mp4
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:00:05.00, start: 0.000000, bitrate: 43 kb/s
    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 320x240 [SAR 1:1 DAR 4:3], 39 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      rotate          : 180
    Side data:
      displaymatrix: rotation of -180.00 degrees

Rotation automatique

ffmpeg fera automatiquement pivoter physiquement la vidéo en fonction des métadonnées de rotation de flux vidéo existantes.

Vous devez disposer d'une version comprenant la validation 1630224, à compter du 2 mai 2015, pour pouvoir utiliser la fonctionnalité d'autorotation.

Exemple

ffmpeg -i input.mp4 -c:a copy output.mp4

Pour désactiver ce comportement, utilisez l'option -noautorotate.


Si l'entrée ne contient pas de métadonnées ou si votre ffmpeg est ancienne

Vous devrez utiliser un filtre pour faire pivoter la vidéo. S'il existe des métadonnées de rotation, vous devrez les supprimer, comme indiqué dans les exemples ci-dessous:

Exemples

En utilisant ffmpeg, vous avez le choix entre trois méthodes d’utilisation des filtres vidéo pour effectuer une rotation de 180 °.

(hflip et vflip

ffmpeg -i input.mp4 -vf "hflip,vflip,format=yuv420p" -metadata:s:v rotate=0 \
-codec:v libx264 -codec:a copy output.mkv

_ { transpose

ffmpeg -i input.mp4 -vf "transpose=2,transpose=2,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

_ { rotate

Ce filtre peut pivoter selon n’importe quel angle et utilise les radians comme unité au lieu de degrés. Cet exemple fera pivoter π/1 radians ou 180 °:

ffmpeg -i input.mp4 -vf "rotate=PI:bilinear=0,format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

Vous pouvez utiliser des degrés à la place. Un degré est égal à π/180 radians. Donc si vous voulez faire une rotation de 45 °:

ffmpeg -i input.mp4 -vf "rotate=45*(PI/180),format=yuv420p" \
-metadata:s:v rotate=0 -codec:v libx264 -codec:a copy output.mp4

Lorsque vous utilisez le filtre rotate, l'interpolation bilinéaire doit être désactivée (en utilisant bilinear=0) pour les angles divisibles par 90, sinon elle peut paraître floue.


Remarques

  • Le filtrage nécessite un encodage. Ces exemples créent des sorties vidéo H.264. Reportez-vous au Guide d’encodage vidéo FFmpeg H.264 } pour obtenir des conseils sur l’obtention de la qualité souhaitée.

  • Sous-échantillonnage de chrominance. J'ai inclus format=yuv420p puisque ffmpeg tentera de minimiser ou d'éviter le sous-échantillonnage de la chrominance (en fonction du codeur, de l'entrée, de la version ffmpeg, etc.). C’est un bon comportement dans un sens purement technique, mais la plupart des acteurs sont incompatibles avec des schémas plus avancés de sous-échantillonnage chromatique. Cela revient à utiliser -pix_fmt yuv420, mais il est situé dans la chaîne de filtres .

  • Copie l'audio. L'option -codec:a copy sera copie du flux (re-mux) au lieu de coder. Il n'y a aucune raison de ré-encoder l'audio si vous voulez simplement manipuler la vidéo uniquement (à moins que vous ne souhaitiez convertir un format audio différent). Cela permettra de gagner du temps, car l'encodage prend beaucoup de temps et préserve la qualité de l'audio.


Faire pivoter lors de la lecture

Sinon, vous pouvez effectuer une rotation lors de la lecture et éviter le ré-encodage. ffplay tournera automatiquement:

ffplay input.mp4

S'il n'y a pas de données secondaires displaymatrix ou de rotation des métadonnées, vous pouvez utiliser des filtres:

ffplay -vf "hflip,vflip" -i input.mp4

... ou référez-vous à votre joueur préféré. La plupart des joueurs dignes d'être utilisés, comme VLC, ont cette capacité.


Obtenir ffmpeg

Les versions plus anciennes de ffmpeg n'incluent pas les capacités de filtrage. Reportez-vous à la page téléchargement de FFmpeg pour connaître plusieurs options, notamment des versions pratiques pour Linux, OS X et Windows, ou reportez-vous à la section FFmpeg Wiki pour guides de compilation étape par étape de ffmpeg). .

96
llogan

FFMPEG a modifié le comportement par défaut pour faire pivoter automatiquement les sources vidéo d'entrée avec les métadonnées "faire pivoter" dans la version v2.7 en 2015 .

Si vous savez que votre script ou votre commande ne s'exécutera jamais sur les versions de ffmpeg antérieures à la version 2.7, la solution la plus simple consiste à supprimer toute rotation personnalisée basée sur des métadonnées.

Dans les autres cas, vous pouvez vous préparer pour l'avenir en conservant votre code de rotation personnalisé et en ajoutant l'indicateur -noautorotate (cette option est prise en charge dans les versions antérieures conservées à ce moment-là).

7
Albin

Les lecteurs multimédias qui utilisent ffmpeg en tant que serveur de décodage peuvent également utiliser tous ses filtres. Voir cette capture d'écran avec le filtre "Offset & Flip". enter image description here

Si vous souhaitez ré-encoder votre vidéo, vous pouvez également consulter Rotation de vidéos avec FFmpeg sur Stackoverflow.

2
Mxx

Voici un script bash qui va générer les fichiers avec la structure de répertoires sous "fixedFiles". Il transforme et fait pivoter les vidéos iOS et transcode les AVI. Le script repose sur l’installation de 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
1

On m'a demandé de l'éditer, de faire précéder le texte, en indiquant que la solution que j'ai finalement trouvée était à la fin du texte. Donc, à la fin, vous trouverez les deux commandes consécutives de ffmpeg qui ont fait pivoter ma vidéo avec la bonne orientation. Le texte précédent visait à donner le plus d’informations possible, comme j’avais vu d’autres messages qui ont été repoussés par manque d’informations. Quoi qu'il en soit, j'espère que cela aide les autres utilisateurs de ffmpeg. Il me semble que le but de hflip et de vflip dans ffmpeg est, au minimum, déroutant et contraire à ce à quoi je m'attendais.

Le fichier merlin.mov est une copie d'une vidéo que j'ai prise sur mon iphone, d'abord chargée sur Dropbox, puis téléchargée sur mon ordinateur portable sous Ubuntu:

    $ uname -a
    Linux gazelle 3.13.0-135-generic #184-Ubuntu SMP
    Wed Oct 18 11:55:51 UTC 2017 x86_64 x86_64 x86_64
    GNU/Linux

Je sais que j'aurais pu monter mon iphone via USB et copier les fichiers directement, mais cela n'a pas fonctionné. mon ordinateur portable reconnaîtrait que l'iphone était connecté, mais ne montait pas son système de fichiers, et je n'ai reçu aucune invite sur mon iPhone pour "faire confiance" à l'ordinateur portable.

La commande que j'avais l'habitude de copier de Dropbox sur mon ordinateur portable était la suivante:

    cp ~/Dropbox/Camera\ Uploads/Video\ Nov\ 02\,\ 9\ 41\ 55\ AM.mov \
            merlin.mov

Le fichier original est une vidéo 1920 x 1080 Codec HEVC/H.265 Fréquencé à 30/s, Débit 8140 kbps, Codec audio MPEG-4 Canaux audio AAC Stéréo, Taux d'échantillonnage de 44100 Hz, Débit binaire de 85 kbps. Quand je le joue sur mon iphone, il est correctement orienté et le son est synchronisé. Lorsque je la joue dans Vidéos sur mon ordinateur portable, le son est inversé et inversé, et le son n'est pas synchronisé. Voici une sortie partielle de "ffmpeg -i merlin.mov":

    Metadata:
    rotate          : 180
    creation_time   : 2017-11-02T14:41:55.000000Z
    handler_name    : Core Media Data Handler
    encoder         : HEVC

Voici la première ligne de sortie de "ffmpeg -version":

ffmpeg version 3.3.3 Copyright (c) 2000-2017 les développeurs de FFmpeg

Les éléments suivants ont laissé la lecture inversée à la fois verticalement et horizontalement, bien qu’elle ait été convertie en MPEG-4 vidéo (vidéo/mp4) et synchronise le son:

    ffmpeg -i merlin.mov -vf 'hflip,vflip' merlinhflipvflip.mp4

Ce qui suit est inversé verticalement pour que la lecture soit verticale, synchronise le son et converti au format MPEG-4, tout en laissant l’horizontale inversée pour fin (ce n’est pas une faute de frappe, j’ai spécifié «hflip»):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4

Ce qui suit a retourné l’horizontale dans la bonne orientation, mais a laissé la lecture à l’envers:

    ffmpeg -i merlin.mov -vf 'vflip' merlinvflip.mp4

Les éléments suivants semblaient n'avoir aucun effet:

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'vflip' merlin2stepA.mp4

J'ai aussi essayé ceci, en me basant sur une commande trouvée sur superuser.com. Il a réussi à synchroniser le son et à le convertir en MPEG-4, mais les orientations horizontale et verticale sont restées incorrectes:

    ffmpeg -i merlin.mov \
            -vf "rotate=PI:bilinear=0,format=yuv420p" \
            -metadata:s:v rotate=0 -codec:v libx264 \
            -codec:a copy merlinrotate.mp4

J'ai aussi essayé ceci, ce qui n'a pas fonctionné non plus en termes de correction de l'orientation:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

Le processus en deux étapes suivant a finalement obtenu ce que je voulais; vertical et horizontal à la fois retournés, le son synchronisé et le format converti en MPEG-4 (Encore une fois, ce n'est pas une faute de frappe; j'ai utilisé hflip dans les deux commandes):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
1
Thomas Smith
ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

A fait le tour pour moi. Vous ne savez pas pourquoi le filtre de transposition ne fournit pas la possibilité de faire une rotation de 180 degrés à la fois, mais peu importe. Consultez la Docs pour plus d’informations.

0
panepeter

Voici les étapes:

  1. Commencez par ouvrir votre fichier vidéo dans QuickTime. Vous pouvez soit lancer QuickTime d’abord, aller à «Fichier» puis à «Ouvrir fichier». Vous pouvez également cliquer avec le bouton droit sur le fichier lui-même, choisir «Ouvrir avec», puis choisir QuickTime.

  2. Une fois la vidéo ouverte, cliquez sur "Modifier". Vous trouverez ensuite les options de rotation et de retournement ci-dessous.

  3. Une fois que vous avez verrouillé l'orientation souhaitée, vous devez exporter votre vidéo avec les nouvelles modifications que vous avez ajoutées. Vous trouverez l’option «Exporter» sous le menu «Fichier» dans QuickTime.

Choisissez les paramètres de fichier que vous souhaitez exporter, puis cliquez sur «OK» pour lancer l’exportation.

Lorsque l’exportation est terminée, vous trouverez votre nouveau fichier à l’endroit où vous avez choisi de l’enregistrer avec l’orientation appropriée!

L'ensemble de ce correctif m'a pris moins de 5 minutes, mais selon la longueur de la vidéo, cela pourrait prendre beaucoup plus de temps (ou moins, encore une fois, cela varie).

source du blog

0
Philippe Matray