Wie kann ich ein Video mit FFmpeg um 180 ° drehen?

69

Ich habe ein Video, das bei der Aufnahme um 180 ° gedreht wurde. Kann man das mit FFmpeg korrigieren?

Louis
quelle
Fragen Sie sich, ob Sie es während der Wiedergabe spiegeln oder mit der richtigen Ausrichtung neu codieren möchten?
Mxx
@Mxx Ich dachte über eine Neukodierung nach, aber was meintest du mit während der Wiedergabe?
Louis
Media-Player, die ffmpeg als Decodierungs-Backend verwenden, können auch alle Filter verwenden. Siehe diesen Screenshot ffdshow-tryout.sourceforge.net/images/front1.png "Offset and flip" -Filter. Siehe auch stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg
Mxx
Oh okay, cool. Das würde für mich funktionieren, aber ich möchte es auch teilen. Ich werde einen Blick auf die SO-Frage werfen.
Louis
5
Der Wortlaut und Titel dieser Frage ist wirklich verwirrend. Das vertikale Spiegeln eines Videos entspricht nicht dem Drehen um 180 Grad (das entspricht einem vertikalen und einem horizontalen Spiegeln). Basierend auf der akzeptierten Antwort bearbeite ich, um die Rotation anzugeben. Derzeit verschmutzt dies die Google-Ergebnisse beim vertikalen Spiegeln von Videos mit ffmpeg.
Jason C

Antworten:

102

Originalgedreht


tl; dr

ffmpeg dreht das Video automatisch, es sei denn:

  • Ihre Eingabe enthält keine Rotationsmetadaten
  • du ffmpegbist zu alt

Rotationsmetadaten

Einige Videos, z. B. von iPhones, werden nicht physisch gespiegelt, sondern enthalten Daten auf der Matrix der Videostream-Anzeige oder rotierende Metadaten. Einige Spieler ignorieren diese Metadaten und andere nicht. ffmpegSehen Sie in der Konsolenausgabe nach, ob Ihre Eingabe solche Metadaten enthält:

$ 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

Autorotation

ffmpeg Das Video wird automatisch physisch entsprechend den vorhandenen Metadaten für die Videodrehung gedreht.

Sie benötigen einen Build mit Commit 1630224 ab dem 2. Mai 2015, um die Autorotationsfunktion verwenden zu können.

Beispiel

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

Um dieses Verhalten zu deaktivieren, verwenden Sie die -noautorotateOption.


Wenn die Eingabe keine Metadaten enthält oder wenn Ihre ffmpegalt ist

Sie müssen einen Filter verwenden, um das Video zu drehen. Wenn Rotationsmetadaten vorhanden sind, müssen diese entfernt werden, wie in den folgenden Beispielen gezeigt:

Beispiele

Mit ffmpegSie haben die Wahl zwischen drei Methoden der Videofilter mit 180 ° drehen.

hflip und 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

Dieser Filter kann in einen beliebigen Winkel gedreht werden und verwendet statt Grad den Bogenmaßstab. In diesem Beispiel wird π / 1 Bogenmaß oder 180 ° gedreht:

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

Sie können stattdessen Grad verwenden. Ein Grad entspricht π / 180 Radiant. Wenn Sie also 45 ° drehen möchten:

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

Bei Verwendung des rotateFilters sollte die bilineare Interpolation bilinear=0für Winkel, die durch 90 teilbar sind, deaktiviert sein (mithilfe von ), da sie sonst verschwommen aussehen kann.


Anmerkungen

  • Das Filtern erfordert Codierung. In diesen Beispielen werden H.264-Videoausgänge erstellt. Informationen zur Erzielung der gewünschten Qualität finden Sie im FFmpeg H.264-Handbuch zur Videokodierung.

  • Chroma-Unterabtastung. Ich habe hinzugefügt, format=yuv420pda ffmpegversucht wird, die Chroma-Unterabtastung zu minimieren oder zu vermeiden (abhängig vom Encoder, Eingang, ffmpegVersion usw.). Dies ist rein technisch gesehen ein gutes Verhalten, aber die meisten Player sind mit "fortgeschritteneren" Chroma-Subsampling-Schemata nicht kompatibel. Dies entspricht der Verwendung -pix_fmt yuv420, befindet sich jedoch in der Filterkette .

  • Kopieren Sie das Audio. Die -codec:a copyOption streamt das Kopieren (Re-Mux) anstelle des Kodierens. Es gibt keinen Grund, das Audio neu zu codieren, wenn Sie nur das Video bearbeiten möchten (es sei denn, Sie möchten es in ein anderes Audioformat konvertieren). Dies spart Zeit, da das Codieren zeitaufwändig ist und die Audioqualität erhalten bleibt.


Bei der Wiedergabe drehen

Alternativ können Sie während der Wiedergabe drehen und eine Neukodierung vermeiden. ffplaydreht sich automatisch:

ffplay input.mp4

Wenn es keine Displaymatrix-Seitendaten gibt oder keine Metadaten rotieren, können Sie Filter verwenden:

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

... oder beziehen Sie sich auf Ihren Lieblingsspieler. Die meisten Player, die es wert sind, verwendet zu werden, wie z. B. VLC, verfügen über diese Funktion.


Bekommen ffmpeg

Ältere Versionen von ffmpeg enthalten keine Filterfunktionen. Siehe die FFmpeg - Download - Seite für mehrere Optionen bequem einschließlich baut für Linux, OS X und Windows, oder beziehen sich auf die FFmpeg Wiki für Schritt- für -Schritt ffmpeg Führer kompilieren .

Logan
quelle
Danke, ich habe es gerade ausprobiert -vf vflipund es hat wie ein Zauber funktioniert. Aber es war eine Neukodierung. Ich bin mir nicht sicher, ob ich dich richtig lese. -vf hflip,vflipWollen Sie damit sagen, dass keine Neukodierung möglich ist?
Louis
ffmpegBei Verwendung von Video- und Audiofiltern muss @Louis neu codiert werden. Allerdings ffplaykönnen auch viele der Filter während der Wiedergabe verwenden , wie sie in meinem zweiten Beispiel gezeigt.
Logan
Ah, ich habe nicht bemerkt, dass es ein anderes Programm war.
Louis
Ich frage mich , ob es einen Weg gibt , als Videoqualität anderer zu erhalten -codec:v libx264? Kann ffmpegnur die gleiche Codierung verwendet werden, ohne dass der Benutzer dies herausfinden muss?
Sadi
1
@ Louis rotateverwendet Bogenmaß als Einheit anstelle von Grad. Ich glaube, die Leute kennen sich mit Abschlüssen besser aus, deshalb habe ich versucht, im Beispiel zu zeigen, wie man Abschlüsse verwendet. Ein Grad entspricht π / 180 Radiant. Wenn Sie also um 45 ° drehen möchten, verwenden Sie einfach rotate="45*(PI/180)".
Logan
7

FFMPEG hat das Standardverhalten dahingehend geändert, dass Eingangsvideoquellen in der Version 2.7 im Jahr 2015 automatisch mit Metadaten "gedreht" werden .

Wenn Sie wissen, dass Ihr Skript oder Befehl auf ffmpeg-Releases, die älter als 2.7 sind, niemals ausgeführt werden kann, besteht die einfachste Lösung darin, benutzerdefinierte Rotationen basierend auf Metadaten zu entfernen.

In anderen Fällen können Sie zukunftssicher sein, indem Sie Ihren benutzerdefinierten Rotationscode -noautorotatebeibehalten und das Flag hinzufügen (dies wird in älteren Versionen unterstützt, die zu diesem Zeitpunkt noch beibehalten wurden).

Albin
quelle
2

Media-Player, die ffmpeg als Decodierungs-Backend verwenden, können auch alle Filter verwenden. Siehe diesen Screenshot mit "Offset & Flip" -Filter.Bildbeschreibung hier eingeben

Wenn Sie Ihr Video neu codieren möchten, lesen Sie alternativ den Artikel Videos mit FFmpeg auf Stackoverflow drehen.

Mxx
quelle
1
Leider wird der transposeFilter, auf den in Videos mit FFmpeg drehen verwiesen wird, nicht um 180 ° gedreht, soweit ich das beurteilen kann.
Logan
1
@LordNeckbeard nicht direkt, aber Sie können zwei transposeFilter miteinander verketten , um den Effekt zu erzielen.
Evilsoup
1
@evilsoup Ah ja, daran habe ich nicht gedacht. Das räumliche Denken ist schwierig; gehen wir einkaufen. Fühlen Sie sich frei, meine Antwort mit einem Beispiel zu aktualisieren.
Logan
1

Es folgt ein Bash-Skript, das die Dateien mit der Verzeichnisstruktur unter "fixedFiles" ausgibt. Es transformiert und dreht iOS-Videos und wandelt AVIs um. Das Skript setzt voraus, dass sowohl exiftool als auch ffmpeg installiert sind .

#!/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
David Costa Faidella
quelle
1

Ich wurde gebeten, dies zu bearbeiten, um dem Text ein Vorwort zu geben und darauf hinzuweisen, dass die Lösung, die ich schließlich fand, am Ende des Textes war. Am Ende finden Sie also die beiden aufeinander folgenden ffmpeg-Befehle, mit denen mein Video erfolgreich in die richtige Ausrichtung gedreht wurde. Der Text davor sollte so viele Informationen wie möglich geben, da ich andere Nachrichten gesehen hatte, die wegen fehlender Informationen abgewiesen wurden. Auf jeden Fall hoffe ich, dass dies anderen hilft, ffmpeg zu verwenden. Es scheint mir, dass der Zweck von hflip und vflip in ffmpeg zumindest verwirrend ist und dem widerspricht, was ich erwartet hatte.

Die Datei merlin.mov ist eine Kopie eines Videos, das ich auf meinem iPhone aufgenommen habe, das zuerst auf Dropbox hochgeladen und dann auf meinen Laptop unter Ubuntu heruntergeladen wurde:

    $ 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

Ich weiß, dass ich mein iPhone über USB einbinden und die Dateien direkt kopieren hätte können, aber das hat nicht funktioniert. Mein Laptop erkannte, dass das iPhone verbunden war, aber das Dateisystem wurde nicht gemountet, und mein iPhone wurde nicht aufgefordert, dem Laptop zu "vertrauen".

Der Befehl, den ich zum Kopieren von Dropbox auf meinen Laptop verwendete, lautete wie folgt:

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

Die Originaldatei ist Video 1920 x 1080 Codec HEVC / H.265 Framerate 30 / Sek., Bitrate 8140 kbps, Audiocodec MPEG-4 AAC-Audiokanäle Stereo, Abtastrate 44100 Hz, Bitrate 85 kbps. Wenn ich es auf meinem iPhone wiedergebe, ist es richtig ausgerichtet und der Ton ist synchronisiert. Wenn ich es in Videos auf meinem Laptop abspiele, ist es verkehrt herum und horizontal umgekehrt, und der Ton ist nicht synchronisiert. Hier ist eine Teilausgabe von "ffmpeg -i merlin.mov":

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

Hier ist die erste Ausgabezeile von "ffmpeg -version":

ffmpeg Version 3.3.3 Copyright (c) 2000-2017 der FFmpeg-Entwickler

Im Folgenden wurde die Wiedergabe sowohl vertikal als auch horizontal invertiert, obwohl sie in MPEG-4-Video (Video / MP4) konvertiert und der Ton synchronisiert wurde:

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

Folgendes wird vertikal invertiert, damit die Wiedergabe aufrecht bleibt, der Sound synchronisiert und in MPEG-4 konvertiert, aber die Horizontale wird falsch umgedreht (dies ist kein Tippfehler, ich habe 'hflip' angegeben):

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

Das Folgende hat die Horizontale in die richtige Ausrichtung gedreht, die Wiedergabe jedoch verkehrt herum belassen:

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

Folgendes schien überhaupt keine Wirkung zu haben:

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

Ich habe es auch versucht, basierend auf einem Befehl, den ich auf superuser.com gefunden habe. Der Sound wurde erfolgreich synchronisiert und in MPEG-4 konvertiert, die horizontale und vertikale Ausrichtung blieb jedoch fehlerhaft:

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

Ich habe es auch versucht, was auch in Bezug auf die Korrektur der Ausrichtung nicht funktionierte:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

Der folgende zweistufige Prozess hat endlich das bekommen, was ich wollte; Vertikal und Horizontal, beide gespiegelt, sound-synchronisiert und in MPEG-4 konvertiert (Auch dies ist kein Tippfehler; ich habe in beiden Befehlen hflip verwendet):

    ffmpeg -i merlin.mov -vf 'hflip' merlinhflip.mp4
    ffmpeg -i merlinhflip.mp4 -vf 'hflip' merlin2stepB.mp4
Thomas Smith
quelle
Während seiner langen Zeit - das scheint mir eine Antwort zu sein - hat er einfach seinen Problemlösungsprozess durchlaufen.
Geselle Geek
@JourneymanGeek In der Tat sind Sie richtig. Ich sehe jetzt in seinem letzten Absatz, dass der folgende zweistufige Prozess endlich das bekommen hat, was ich wollte . Gutes Auge. (Ich habe wirklich den ganzen Beitrag gelesen, aber meine Augen waren wahrscheinlich glasig, als ich dort ankam).
Ich sage Reinstate Monica
Gute Arbeit bei der Verbesserung Ihrer Antwort. Sie haben es gut gemacht, genügend Details für Ihre Antwort anzugeben. Versuchen Sie beim Stöbern auf der Website zu beobachten, wie andere gute Antworten Klarheit mit Detailgenauigkeit in Einklang bringen.
Ich sage Reinstate Monica
0

Hier sind die Schritte:

  1. Öffnen Sie zuerst Ihre Videodatei in QuickTime. Sie können entweder QuickTime zuerst starten, zu "Datei" und dann zu "Datei öffnen" gehen. Oder klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie "Öffnen mit" und anschließend "QuickTime".

  2. Sobald das Video geöffnet ist, klicken Sie auf "Bearbeiten" und Sie finden die Optionen "Drehen" und "Drehen" direkt darunter

  3. Sobald Sie die gewünschte Ausrichtung festgelegt haben, müssen Sie Ihr Video mit den neu hinzugefügten Änderungen exportieren. Die Option "Exportieren" finden Sie in QuickTime im Menü "Datei".

Wählen Sie die Dateieinstellungen aus, unter denen Sie exportieren möchten, und klicken Sie auf "OK", um den Export zu starten.

Nach Abschluss des Exportvorgangs finden Sie Ihre neue Datei an der Stelle, an der Sie sie mit der richtigen Ausrichtung gespeichert haben.

Das ganze Update hat weniger als 5 Minuten gedauert, aber je nach Länge des Videos kann es viel länger dauern (oder auch kürzer, es variiert).

Blog-Quelle

Philippe Matray
quelle
0
ffmpeg -i input.mp4 -filter:v "transpose=1,transpose=1" output.mp4

Hat den Trick für mich getan. Ich bin nicht sicher, warum der Transponierungsfilter nicht die Möglichkeit bietet, auf einmal um 180 Grad zu drehen, aber was auch immer. Weitere Informationen finden Sie in den Dokumenten .

panepeter
quelle