Videos mit FFmpeg drehen


417

Ich habe versucht herauszufinden, wie man Videos mit FFmpeg dreht. Ich arbeite mit iPhone-Videos, die im Hochformat aufgenommen wurden. Ich weiß, wie man die aktuellen Rotationsgrade mit MediaInfo (ausgezeichnete Bibliothek, übrigens) bestimmt, aber ich stecke jetzt bei FFmpeg fest.

Nach dem , was ich gelesen habe, müssen Sie eine vfilter- Option verwenden. Nach dem, was ich sehe, sollte es so aussehen:

ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4

Ich kann dies jedoch nicht zum Laufen bringen. Erstens existiert -vfilters nicht mehr, es ist jetzt nur -vf . Zweitens erhalte ich diesen Fehler:

No such filter: 'rotate'
Error opening filters!

Soweit ich weiß, habe ich einen All-Options-On-Build von FFmpeg. Das Ausführen von ffmpeg -filtern zeigt Folgendes :

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.

Die Optionen für vflip und hflip sind großartig, aber sie bringen mich einfach nicht dahin, wo ich hin muss. Ich muss in der Lage sein, Videos mindestens um 90 Grad zu drehen. 270 Grad wären auch eine ausgezeichnete Option. Wo sind die Drehoptionen geblieben?


Meine Antwort wurde aktualisiert. Es sieht so aus, als ob dieser Filter erst letzten Monat zur Quelle hinzugefügt wurde.
Williams

76
Für alle, die nach einer 180-Grad-Drehung suchen:-vf "vflip,hflip"
OrangeDog

4
Ich frage mich, ob dies erreicht werden kann, ohne das Video zu dekodieren und dann neu zu kodieren - so wie JPEGTRAN JPEG-Bilder verlustfrei drehen kann ...
Mikhail T.

2
Siehe hier für Rotationsflagge: stackoverflow.com/questions/15335073/…
Davor Josipovic

1
Ich habe gerade ein um 180 ° gedrehtes Video mit "transponieren = 1, transponieren = 1" auf vimeo hochgeladen. Obwohl ich das gedrehte Video wiedergeben kann, wurde es von vimeo abgelehnt. @ OrangeDogs Ansatz -vf "vflip,hflip"funktioniert wie ein Zauber.
Besi

Antworten:


682

90 im Uhrzeigersinn drehen:

ffmpeg -i in.mov -vf "transpose=1" out.mov

Für den Transponierungsparameter können Sie Folgendes übergeben:

0 = 90CounterCLockwise and Vertical Flip (default)
1 = 90Clockwise
2 = 90CounterClockwise
3 = 90Clockwise and Vertical Flip

Verwenden Sie -vf "transpose=2,transpose=2"für 180 Grad.

Stellen Sie sicher, dass Sie von hier aus eine aktuelle ffmpeg-Version verwenden (ein statischer Build funktioniert einwandfrei).

Beachten Sie, dass dadurch die Audio- und Videoteile neu codiert werden. Normalerweise können Sie das Audio kopieren, ohne es zu berühren -c:a copy. Um die Videoqualität zu ändern, stellen Sie die Bitrate ein (z. B. mit -b:v 1M) oder lesen Sie die H.264-Codierungsanleitung, wenn Sie VBR-Optionen wünschen.

Eine Lösung besteht auch darin, dieses praktische Skript zu verwenden .


8
Das Video enthält weiterhin die Orientierungsinformationen, sodass das Video jetzt auf dem iPhone nicht mehr korrigiert wird.
srcspider

25
Wenn ich diesen Befehl verwende, erhalte ich eine Videoausgabe von geringer Qualität , es sei denn, ich habe gerade festgestellt, dass ich auch diesen Parameter verwende : -vcodec libx264. Aber es wäre großartig, wenn ich nicht nachschlagen müsste, welche Codierung als ffmpeg verwendet werden soll. Irgendwelche Vorschläge?
Sadi

8
Gibt es nach dem Vorbild von Sadi eine Möglichkeit, die Qualität des Originalvideos zu "kopieren"?
Alec Jacobson

58
Für 180 können Sie verwenden-vf "transpose=2,transpose=2"
Alex Pliutau

23
Aktuelle Dokumente weisen darauf hin, dass "numerische Werte veraltet sind und zugunsten symbolischer Konstanten gelöscht werden sollten." ffmpeg.org/ffmpeg-filters.html#transpose So cclock_flip, clock, cclockoder clock_flipstatt 0, 1, 2oder 3.
l

149

Wenn Sie Ihr Video nicht neu codieren möchten UND Ihr Player Rotationsmetadaten verarbeiten kann, können Sie die Rotation in den Metadaten einfach mit ffmpeg ändern:

ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v

11
wie etwa das Drehen - Metadaten überprüfen Sie zuerst mitffmpeg -i input.m4v 2>&1 | grep rotate
lidaobing

60
Dies ist bei weitem die beste Antwort. Es gibt jedoch eine kleine Verbesserung zu tun. Um zu vermeiden, dass die verbleibenden Metadaten (wie Datum, Kamera) im Video verloren gehen, tun Sie dies ffmpeg -i input.m4v -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.m4v. Auf diese Weise werden alle globalen Metadaten in der Eingabedatei als globale Metadaten in die Ausgabedatei kopiert und nur die Rotations-Metadaten werden geändert.
Migle

11
Wenn Sie ein Video im Hochformat haben und es nur "UN-drehen" möchten, um eine Standardgröße von 1920 x 1080 zu erhalten, möchten Sie wahrscheinlich rotate=0.
Mivk

1
Versucht -metadata:s:v rotate="180", hat nicht funktioniert. Soll das funktionieren?
Ondra Žižka

7
IMHO beste Lösung, da keine Neukodierung erforderlich ist und die meisten Video-Player die Metadatenrotation unterstützen. Auch Cloud-Dienste wie Google Fotos. Denken Sie jedoch daran, dass ffmpeg nicht unbedingt alle Metadaten aus der Originaldatei kopiert! Daher würde ich empfehlen, explizit anzugeben, alle anderen Metadaten aus der Originaldatei zu kopieren:ffmpeg -i input.mp4 -codec copy -map_metadata 0 -metadata:s:v:0 rotate=0 output.mp4
Andreas

83

Hast du es schon versucht transpose? Wie (aus der anderen Antwort)

 ffmpeg -i input -vf transpose=2 output

Wenn Sie eine alte Version verwenden, müssen Sie ffmpeg aktualisieren, wenn Sie die Transponierungsfunktion verwenden möchten, wie sie im Oktober 2011 hinzugefügt wurde.

Die FFmpeg- Download- Seite bietet statische Builds, die Sie direkt ausführen können, ohne sie kompilieren zu müssen.


1
Nein, habe ich nicht. Ich wusste nicht, dass es existiert. Ich werde das versuchen.
Jocull

Der Transponierungsfilter scheint in keinem meiner FFmpeg-Builds vorhanden zu sein. Wie soll ich es hinzufügen?
Jocull

In der Version der Dokumente vom 15.05.2011 ist der korrekte Link jetzt ffmpeg.org/ffmpeg-doc.html#SEC93
Peter Hansen

6
Es fühlt sich an, als wäre ich dafür bestraft worden, dass ich 1,5 Jahre vor der akzeptierten Antwort eine nützliche Antwort angeboten habe.
Williams

1
@ JonasB Trennen Sie die Filter durch Kommas. Siehe stackoverflow.com/questions/6195872/…
rwilliams

19

Ich bin auf diese Seite gestoßen, als ich nach der gleichen Antwort gesucht habe. Es ist nun sechs Monate her, seit dies ursprünglich gefragt wurde und die Builds wurden seitdem viele Male aktualisiert. Ich wollte jedoch eine Antwort für alle anderen hinzufügen, die hier auf der Suche nach diesen Informationen sind.

Ich verwende Debian Squeeze und FFmpeg- Version aus diesen Repositories.

Die MAN-Seite für ffmpeg gibt die folgende Verwendung an

ffmpeg -i inputfile.mpg -vf "transpose=1" outputfile.mpg

Der Schlüssel ist, dass Sie keine Gradvariable verwenden sollen, sondern eine vordefinierte Einstellungsvariable auf der MAN-Seite.

0=90CounterCLockwise and Vertical Flip  (default) 
1=90Clockwise 
2=90CounterClockwise 
3=90Clockwise and Vertical Flip

Danke für die Information! Ich war nie in der Lage, dies tatsächlich zum Laufen zu bringen, da ich im Allgemeinen Probleme habe, aus der Quelle zu bauen. Ich kann sehen, ob ich es jetzt wieder zum Laufen bringen kann.
Jocull

transponieren = 3 bewirkt, dass das Bild gespiegelt wird
Daniel Kobe

transponieren = 2 funktionierte ohne Spiegelung für mein 270 gedrehtes Video
Daniel Kobe

17

Um das Bild im Uhrzeigersinn zu drehen, können Sie den Drehfilter verwenden, der einen positiven Winkel im Bogenmaß anzeigt. Bei 90 Grad, die PI / 2 entsprechen, können Sie dies folgendermaßen tun:

ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4

für gegen den uhrzeigersinn muss der winkel negativ sein

ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4

Der Transponierungsfilter funktioniert für 90 Grad gleich gut, für andere Winkel ist dies jedoch eine schnellere oder einzige Wahl.


2
das ist toll. Ich fand heraus, dass es möglich ist, eine feinkörnigere Auflösung des Bogenmaßes zu erhalten, da *sich dies als Multiplikation verhält: ffmpeg -i in.avi -vf "rotate=-8*PI/40" -q 1 out.avi (etwas weniger Rotation als -PI / 4 = -10 * PI / 40)
Gleichung

12
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4 

wird nicht funktionieren, auch mit der neuesten Quelle ...

muss die Reihenfolge ändern:

ffmpeg -i input.mp4 -vf vflip output.mp4

funktioniert gut


Das liegt daran, dass Sie den Filter auf die falsche Datei anwenden ... versuchen Sie es mit ffmpeg -i input.mp4 -vf "rotate = 90" output.mp4, dann funktioniert es
Patrick

2
"Drehen Sie das Video um einen beliebigen Winkel im Bogenmaß ." Dokumentation: ffmpeg.org/ffmpeg-filters.html#rotate Also, Bogenmaß rotate=PI/2oder rotate=90*PI/180wird benötigt
l

Das ist fantastisch
Tessaracter

7

Wenn der Fehler "Codec ist experimentell, aber experimentelle Codecs sind nicht aktiviert" angezeigt wird, verwenden Sie Folgendes:

ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile

Ist mit mir für eine .mov-Datei mit AAC-Audio passiert.


Dies war das einzige Beispiel, das für mich funktioniert hat, aber die Qualität war schrecklich und sehr blockig. Außerdem wurde ein 1080 x 1920-Video auf 352 x 640 verkleinert. Ich vermisse wohl ein oder zwei Schalter. Irgendwelche Vorschläge?
LOlliffe

1
@LOlliffe hinzufügen-sameq
Andrew Schleifer

2
@ AndrewSchleifer Danke. Ich habe das versucht, aber ffmpeg warf mich zurück - Option 'sameq' was removed. If you are looking for an option to preserve the quality (which is not what -sameq was for), use -qscale 0 or an equivalent quality factor option. Failed to set value '1' for option 'sameq': Invalid argument qscale gibt auch einen Fehler. Please use -q:a or -q:v, -qscale is ambiguous, funktioniert aber immer noch.
LOlliffe

3

Dieses Skript gibt die Dateien mit der Verzeichnisstruktur unter "fixedFiles" aus. Im Moment ist auf MOV-Dateien festgelegt und führt abhängig von der ursprünglichen "Drehung" des Videos eine Reihe von Transformationen durch. Funktioniert mit iOS aufgenommenen Videos auf einem Mac mit Mavericks, sollte aber leicht exportierbar sein. Verlässt sich darauf, dass sowohl exiftool als auch ffmpeg installiert wurden .

#!/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

2
Autsch ... Das mag funktionieren, ist aber absolut abscheulich. Zuallererst die allgemeine Regel der Shell-Programmierung: Sie brauchen nie mehr als eine von grep, cut, awk oder sed in einer Pipe. Jeder grep | cut | sed ist entweder mit sed oder awk alleine machbar. Insbesondere kann exiftool dann aufgefordert werden, nur die gewünschten Tags auszugeben. Statt also die Rotation herauszufiltern, verwenden Sie einfach "exiftool -Rotation". Drittens benötigen Sie nicht so viele "Auswertungen" und Ihr "if test ..." sollte durch case $ ROTATION in ersetzt werden - sowohl für die Lesbarkeit als auch für die Effizienz. Viel Glück!
Mikhail T.

Keine Würfel: [Parsed_pad_2 @ 0x7f8b15c3a580] Input area -420:0:1500:1080 not within the padded area 0:0:1080:1080 or zero-sized\ n ` [Parsed_pad_2 @ 0x7f8b15c3a580] Failed to configure input pad on Parsed_pad_2\ n Error reinitializing filters!\ n Failed to inject frame into filter network: Invalid argument\ n Error while processing the decoded data for stream #0:0\ nConversion failed!
Slipp D. Thompson

2

Alexys Antwort funktionierte fast für mich, außer dass ich diesen Fehler bekam:

Zeitbasis 1/90000 wird vom MPEG 4-Standard nicht unterstützt. Der maximal zulässige Wert für den Zeitbasis-Nenner beträgt 65535

Ich musste nur einen Parameter (-r 65535/2733) zum Befehl hinzufügen und es funktionierte. Der volle Befehl war also:

ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4

Wenn Sie nach einer Framerate für "NTSC-Filme" suchen, ist 24000/1001dies genauer.
Reino

2

Eine zusätzliche Lösung mit einem anderen Ansatz als die zuletzt genannten Lösungen besteht darin, zu überprüfen, ob Ihr Kameratreiber die v4l2-Kamerasteuerung unterstützt (was sehr häufig vorkommt).
Geben Sie im Terminal einfach Folgendes ein:

v4l2-ctl -L

Wenn Ihr Kameratreiber die v4l2-Kamerasteuerung unterstützt, sollten Sie Folgendes erhalten (die folgende Liste hängt von den von Ihrem Kameratreiber unterstützten Steuerelementen ab):

               contrast (int)    : min=0 max=255 step=1 default=0 value=0 flags=slider
             saturation (int)    : min=0 max=255 step=1 default=64 value=64 flags=slider
                    hue (int)    : min=0 max=359 step=1 default=0 value=0 flags=slider
white_balance_automatic (bool)   : default=1 value=1 flags=update
            red_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
           blue_balance (int)    : min=0 max=4095 step=1 default=0 value=128 flags=inactive, slider
               exposure (int)    : min=0 max=65535 step=1 default=0 value=885 flags=inactive, volatile
         gain_automatic (bool)   : default=1 value=1 flags=update
                   gain (int)    : min=0 max=1023 step=1 default=0 value=32 flags=inactive, volatile
        horizontal_flip (bool)   : default=0 value=0
          vertical_flip (bool)   : default=0 value=0

Und wenn Sie Glück haben, unterstützt es horizontal_flip und vertikale_flip .
Dann müssen Sie nur noch den horizontalen_Flip setzen durch:

v4l2-ctl --set-ctrl horizontal_flip=1

oder der vertikale_flip von:

v4l2-ctl --set-ctrl vertical_flip=1

Anschließend können Sie Ihr Videogerät anrufen, um ein neues Video aufzunehmen (siehe Beispiel unten), und das Video wird gedreht / gespiegelt.

ffmpeg -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -f mpegts input.mp4

Wenn Sie ein bereits vorhandenes Video verarbeiten müssen, ist diese Methode natürlich nicht die Lösung, nach der Sie suchen.

Der Vorteil dieses Ansatzes besteht darin, dass wir das Bild in der Sensorebene umdrehen, sodass der Sensor des Treibers uns bereits das umgedrehte Bild liefert, und dies spart der Anwendung (wie FFmpeg) jede weitere und unnötige Verarbeitung.


Tolle Informationen zu v4l2 hier. Das Drehen in die richtige Ausrichtung zur Aufnahmezeit ist natürlich vorzuziehen :) Diese fast 10 Jahre alte Frage (wow!) Wurde ursprünglich zu Videos gestellt, die von iOS-Geräten hochgeladen wurden, wenn dies einen Kontext bietet :)
jocull

Ich bin ein bisschen neu in dieser Community und diese Frage ist viel älter als mein Dienstalter hier ... Ich denke wirklich, dass es eine gute (und häufige) Frage ist, daher glaube ich, dass diese alte Frage vielen FFmpeg-Benutzern weiterhin helfen wird.
JM

1

Leider unterstützt die Ubuntu-Version von ffmpeg Videofilter.

Sie müssen Avidemux oder einen anderen Editor verwenden, um den gleichen Effekt zu erzielen.

Auf programmatische Weise wurde ein Mencoder empfohlen.


1
Meinten Sie "Ubuntu-Version von ffmpeg unterstützt keine Videofilter"?
user1438038

2
Zu Ihrer Information: "FFmpeg ist in Ubuntu 15.04 Vivid Vervet zurückgekehrt." oder kann für Ubuntu kompiliert werden. -> trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
l

avconv tut dies (in 14.04) und scheint genauso zu funktionieren. (Aber für spätere Versionen verwenden Sie auf jeden Fall FFmpeg.)
SilverWolf - Reinstate Monica

1

Smartphone: Video im Vertikalformat aufgenommen

Möchten Sie es an eine Webseite senden, war es 90 ° nach links (gegen den Uhrzeigersinn, Querformat) hmm.

ffmpeg -i input.mp4 -vf "rotate=0" output.mp4

macht es. Ich habe wieder vertikales Format

debian buster: ffmpeg --version ffmpeg version 4.1.4-1 ~ deb10u1 Copyright (c) 2000-2019 die FFmpeg-Entwickler

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.