556 Stimmen

Drehen von Videos mit FFmpeg

Ich habe versucht, herauszufinden, wie man Videos mit FFmpeg drehen kann. Ich arbeite mit iPhone-Videos, die im Hochformat aufgenommen wurden. Ich weiß, wie ich die aktuellen Drehgrade mit MediaInfo (ausgezeichnete Bibliothek, btw), aber ich hänge jetzt bei FFmpeg fest.

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

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

Ich kann das aber nicht zum Laufen bringen. Erstens, -vFilter gibt es nicht mehr, es ist jetzt nur noch -vf . Zweitens: Ich erhalte diese Fehlermeldung:

No such filter: 'rotate'
Error opening filters!

Soweit ich weiß, habe ich eine aktivierte Version von FFmpeg mit allen Optionen. Läuft ffmpeg -filter zeigt dies:

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.

Mit den Optionen für vflip y hflip sind großartig und alles, aber sie bringen mich nicht ans Ziel. Ich brauche die Möglichkeit, Videos mindestens um 90 Grad zu drehen. 270 Grad wäre auch eine hervorragende Option. Wo sind die Optionen zum Drehen geblieben?

12voto

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

funktioniert nicht, auch nicht mit dem neuesten Quellcode...

müssen die Reihenfolge ändern:

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

funktioniert einwandfrei

8voto

sabujp Punkte 951

Wenn Sie die Fehlermeldung "Codec ist experimentell, aber experimentelle Codecs sind nicht aktiviert" erhalten, verwenden Sie diese :

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

Bei mir ist das bei einer .mov-Datei mit aac-Audio passiert.

6voto

J.M. Punkte 342

Eine weitere Lösung, die sich von den zuletzt genannten unterscheidet, ist zu prüfen, ob Ihr Kameratreiber die v4l2-Kamerasteuerung unterstützt (was sehr häufig der Fall ist).
Geben Sie einfach in das Terminal ein:

v4l2-ctl -L

Wenn Ihr Kameratreiber die v4l2-Kamerasteuerungen unterstützt, sollten Sie etwa Folgendes erhalten (die folgende Liste hängt von den Steuerungen ab, die Ihr Kameratreiber unterstützt):

               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 y vertikal_flip .
Dann müssen Sie nur noch die Option horizontal_flip von:

v4l2-ctl --set-ctrl horizontal_flip=1

oder die vertikal_flip von:

v4l2-ctl --set-ctrl vertical_flip=1

und dann können Sie Ihr Videogerät aufrufen, 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 bearbeiten müssen, ist diese Methode natürlich nicht die Lösung, die Sie suchen.

Der Vorteil dieses Ansatzes ist, dass wir das Bild auf der Sensorebene spiegeln, so dass der Sensor des Treibers uns das Bild bereits gespiegelt liefert, und das erspart der Anwendung (wie FFmpeg) jede weitere und unnötige Verarbeitung.

3voto

Dieses Skript, das die Dateien mit der Verzeichnisstruktur unter "fixedFiles" ausgeben wird. Im Moment ist auf MOV-Dateien fixiert und wird eine Reihe von Transformationen abhängig von der ursprünglichen "Rotation" des Videos ausführen. Funktioniert mit von iOS aufgenommenen Videos auf einem Mac mit Mavericks, sollte aber leicht exportierbar sein. Setzt voraus, dass beide Programme installiert sind exiftool y 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

3voto

Sarthak Singhal Punkte 1076

Da der Befehl ffmpeg transpose sehr langsam ist, verwenden Sie den folgenden Befehl, um ein Video um 90 Grad im Uhrzeigersinn zu drehen.

Schnellbefehl (ohne Kodierung)-

ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=270 output.mp4

Für die vollständige Videokodierung (Befehl Slow, führt die Kodierung durch)

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X