web-dev-qa-db-ja.com

FFmpegでビデオを回転させる

私はFFmpegでビデオを回転させる方法を見つけようとしていました。私はiPhoneのビデオをポートレートモードで撮影しています。 MediaInfo (優れたライブラリ、btw)を使用して現在の回転角度を確認する方法はわかっていますが、今はFFmpegを使用しています。

私が読んだものから、あなたが使う必要があるのはvfilterオプションです。私が見たものによると、それはこのように見えるはずです:

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

しかし、私はこれを機能させることができません。まず、 - vfiltersはもう存在しません。現在は - vfに過ぎません。第二に、私はこのエラーが出ます:

No such filter: 'rotate'
Error opening filters!

私の知る限りでは、私はFFmpegのオールオプションオンビルドを持っています。 ffmpeg -filtersを実行すると、次のようになります。

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.

vfliphflipのオプションを用意するのは素晴らしいことですが、必要な場所にアクセスできない場合もあります。最低でも90度ビデオを回転させる機能が必要です。 270度は同様に持っているための優れた選択肢となります。回転オプションはどこに行ったのですか?

351
jocull

時計回りに90度回転します。

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

転置パラメータに渡すことができます:

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

180度の場合は-vf "transpose=2,transpose=2"を使用してください。

ここから最新のffmpegバージョン を使用するようにしてください (静的ビルドは問題なく動作します)。

これはオーディオとビデオの部分を再エンコードすることに注意してください。 -c:a copyを使うことで、通常は触らずにオーディオをコピーできます。ビデオ品質を変更するには、VBRオプションが必要な場合はビットレートを設定するか(たとえば-b:v 1Mで)、または H.264エンコーディングガイド を参照してください。

解決策は、この 便利スクリプト を使うことです。

583
Alexy

あなたがあなたのビデオを再エンコードしたくなくて、あなたのプレーヤーが回転メタデータを扱うことができるならば、あなたはffmpegを使ってメタデータの回転を変えることができます:

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

あなたは transpose を試しましたか?好き(他の答えから)

 ffmpeg -i input -vf transpose=2 output

古いバージョンを使用している場合、転置機能を使用したい場合は、2011年10月に追加されたように、ffmpegを更新する必要があります。

FFmpeg ダウンロード ページには、静的なビルドが用意されており、コンパイルすることなく直接実行できます。

80
rwilliams

私は同じ答えを探している間にこのページに出くわした。これが最初に質問されてから6ヶ月が経ち、それ以来ビルドは何度も更新されてきました。しかし、私はこの情報を探してここに出くわす誰かのために答えを追加したいと思いました。

私はそれらのリポジトリからDebian SqueezeとFFmpegバージョンを使っています。

FfmpegのMANページには、次のように記述されています。

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

重要なのは、度数変数ではなくMANページの定義済み設定変数を使用することです。

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

画像を時計回りに回転させるには、回転フィルタを使用して、正の角度をラジアンで示します。 90度がPI/2と同じ場合は、次のようにできます。

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

反時計回りに角度は負でなければなりません

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

転置フィルタは90度でも同じように機能しますが、他の角度ではこれはより速いか、または唯一の選択です。

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

最新の情報源でもうまくいかないでしょう….

順序を変更する必要があります。

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

正常に動作します

11
nano

「コーデックは実験的ですが実験的コーデックは有効になっていません」というエラーが表示される場合は、次のようにします。

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

Aacオーディオ付きの.movファイルを探していました。

6
sabujp

このスクリプトは、 "fixedFiles"の下にディレクトリ構造を持つファイルを出力します。現時点ではMOVファイルに固定されており、ビデオの元の "回転"に応じていくつかの変換を実行します。 Mavericksを実行しているMac上でiOSキャプチャビデオを使用できますが、簡単にエクスポートできるはずです。 exiftoolffmpegの両方をインストールしたことに依存しています。

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

私がこのエラーを受けていたことを除いてAlexyの答えは私のためにほとんどうまくいきました:

タイムベース1/90000はMPEG 4規格ではサポートされていません。タイムベース分母の最大許容値は65535です。

コマンドにパラメーター(-r 65535/2733)を追加するだけでうまくいきました。完全なコマンドはこのようにしていました:

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

残念ながら、ffmpegのUbuntu版はビデオフィルタをサポートしています。

同じ効果を得るためには、avidemuxまたは他のエディタを使用する必要があります。

プログラム的には、mencoderが推奨されています。

1
ldig