私は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.
vflipとhflipのオプションを用意するのは素晴らしいことですが、必要な場所にアクセスできない場合もあります。最低でも90度ビデオを回転させる機能が必要です。 270度は同様に持っているための優れた選択肢となります。回転オプションはどこに行ったのですか?
時計回りに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エンコーディングガイド を参照してください。
解決策は、この 便利スクリプト を使うことです。
あなたがあなたのビデオを再エンコードしたくなくて、あなたのプレーヤーが回転メタデータを扱うことができるならば、あなたはffmpegを使ってメタデータの回転を変えることができます:
ffmpeg -i input.m4v -metadata:s:v rotate="90" -codec copy output.m4v
私は同じ答えを探している間にこのページに出くわした。これが最初に質問されてから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
画像を時計回りに回転させるには、回転フィルタを使用して、正の角度をラジアンで示します。 90度がPI/2と同じ場合は、次のようにできます。
ffmpeg -i in.mp4 -vf "rotate=PI/2" out.mp4
反時計回りに角度は負でなければなりません
ffmpeg -i in.mp4 -vf "rotate=-PI/2" out.mp4
転置フィルタは90度でも同じように機能しますが、他の角度ではこれはより速いか、または唯一の選択です。
ffmpeg -vfilters "rotate=90" -i input.mp4 output.mp4
最新の情報源でもうまくいかないでしょう….
順序を変更する必要があります。
ffmpeg -i input.mp4 -vf vflip output.mp4
正常に動作します
「コーデックは実験的ですが実験的コーデックは有効になっていません」というエラーが表示される場合は、次のようにします。
ffmpeg -i inputFile -vf "transpose=1" -c:a copy outputFile
Aacオーディオ付きの.movファイルを探していました。
このスクリプトは、 "fixedFiles"の下にディレクトリ構造を持つファイルを出力します。現時点ではMOVファイルに固定されており、ビデオの元の "回転"に応じていくつかの変換を実行します。 Mavericksを実行しているMac上でiOSキャプチャビデオを使用できますが、簡単にエクスポートできるはずです。 exiftoolと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
私がこのエラーを受けていたことを除いてAlexyの答えは私のためにほとんどうまくいきました:
タイムベース1/90000はMPEG 4規格ではサポートされていません。タイムベース分母の最大許容値は65535です。
コマンドにパラメーター(-r 65535/2733)を追加するだけでうまくいきました。完全なコマンドはこのようにしていました:
ffmpeg -i in.mp4 -vf "transpose=1" -r 65535/2733 out.mp4
残念ながら、ffmpegのUbuntu版はビデオフィルタをサポートしています。
同じ効果を得るためには、avidemuxまたは他のエディタを使用する必要があります。
プログラム的には、mencoderが推奨されています。