FFmpegでビデオを180°回転させる方法は?


69

録画時に180°回転したビデオがあります。FFmpegでこれを修正することはできますか?


再生中にフリップするか、正しい向きで再エンコードするかについて尋ねていますか?
Mxx

@Mxx再エンコードを考えていましたが、再生中はどういう意味でしたか?
ルイ

デコードバックエンドとしてffmpegを使用するメディアプレーヤーも、そのすべてのフィルターを利用できます。このスクリーンショットをご覧くださいffdshow-tryout.sourceforge.net/images/front1.png「オフセットとフリップ」フィルター。stackoverflow.com/questions/3937387/rotating-videos-with-ffmpeg
Mxx

いいよ、クール。それは私のために働くだろうが、私もそれを共有したい。SOの質問を見てみましょう。
ルイ

5
この質問の文言とタイトルは本当に紛らわしいです。ビデオを垂直方向に反転させることは、180度回転させることとは異なります(垂直方向の反転および水平方向の反転同じです)。受け入れられた回答に基づいて、ローテーションを指定するために編集しています。現在、これはffmpegで動画を垂直方向に反転させた場合にGoogleの結果を汚染しています。
ジェイソンC

回答:


102

元の回転した


tl; dr

ffmpeg 次の場合を除き、動画を自動的に回転させます:

  • 入力に回転メタデータが含まれていません
  • あなたffmpegは年を取りすぎています

ローテーションメタデータ

iPhoneなどの一部のビデオは、物理的に反転されていませんが、ビデオストリームディスプレイマトリックス側のデータが含まれているか、メタデータを回転しています。これらのメタデータを無視するプレーヤーと無視しないプレーヤーがいます。参照してくださいffmpeg、あなたの入力は、このようなメタデータを持っているかどうかを確認するために出力をコンソール:

$ 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

自動回転

ffmpeg 既存のビデオストリーム回転メタデータに従って、ビデオを自動的に物理的に回転します。

自動回転機能を使用するには、2015年5月2日から、コミット1630224を含むビルドが必要です。

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

この動作を無効にするには、-noautorotateオプションを使用します。


入力にメタデータが含まれていない場合、またはffmpeg古い場合

ビデオを回転させるにはフィルターを使用する必要があります。回転メタデータが存在する場合は、以下の例に示すように削除する必要があります。

ffmpegあなたを使用すると、ビデオフィルターを使用して180°回転する3つの方法を選択できます。

hflip そして 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

このフィルターは任意の角度に回転でき、度ではなく単位としてラジアンを使用します。この例では、π/ 1ラジアンまたは180°回転します。

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

代わりに度を使用できます。1度はπ/ 180ラジアンに相当します。45°回転させたい場合:

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

rotateフィルターを使用する場合bilinear=0、90で割り切れる角度に対して双線形補間をオフにする必要があります(そうしないと、ぼやけて見える場合があります)。


ノート

  • フィルタリングにはエンコードが必要です。これらの例は、H.264ビデオ出力を作成します。必要な品質を得るためのガイダンスについては、FFmpeg H.264ビデオエンコーディングガイドを参照してください。

  • クロマのサブサンプリング。エンコーダ、入力、バージョンなどに応じて、クロマサブサンプリングを最小化または回避しようとするためformat=yuv420p、私は含めffmpegましたffmpeg。これは純粋に技術的な意味では良い動作ですが、ほとんどのプレーヤーは、より「高度な」クロマサブサンプリングスキームと互換性がありません。これはを使用するのと同じですが、-pix_fmt yuv420便利なのはフィルターチェーンにあります。

  • オーディオをコピーします。この-codec:a copyオプションは、エンコードではなくコピー(re-mux)をストリーミングします。ビデオのみを操作する場合は、オーディオを再エンコードする必要はありません(別のオーディオ形式に変換する場合を除く)。エンコードには時間がかかるため、これにより時間が節約され、オーディオの品質が維持されます。


再生時に回転

または、再生時に回転し、再エンコードを回避できます。ffplay自動的に回転します:

ffplay input.mp4

displaymatrix側のデータがない場合、またはメタデータを回転させる場合は、フィルターを使用できます。

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

...またはお気に入りのプレーヤーを参照します。VLCなど、使用する価値のあるほとんどのプレーヤーにはこの機能があります。


取得 ffmpeg

ffmpegの古いビルドには、フィルタリング機能が含まれていません。Linux、OS X、およびWindows用の便利なビルドを含むいくつかのオプションについてはFFmpegダウンロードページを参照するか、ステップバイステップのffmpegコンパイルガイドについてはFFmpeg Wikiを参照してください。


おかげで、試してみたところ-vf vflip、それは魅力のように機能しました。しかし、それは再エンコードでした。私があなたを正しく読んでいるかどうかはわかりません。-vf hflip,vflip再エンコードしないと言っていますか?
ルイ

@Louis ffmpegでは、ビデオおよびオーディオフィルターを使用するときに再エンコードする必要があります。ただし、ffplay2番目の例に示すように、再生中に多くのフィルターを使用することもできます。
llogan

ああ、それが別のプログラムであることに気づかなかった。
ルイ

ビデオ品質を維持する方法は他にあるの-codec:v libx264だろうか?ffmpegユーザーがそれを理解しようとせずに、同じエンコーディングを使用できますか?
サディ

1
@Louis rotateは、度ではなく単位としてラジアンを使用します。人々は学位に精通していると思うので、例では学位の使用方法を示しました。1度はπ/ 180ラジアンに相当します。したがって、45°回転する場合は、を使用しますrotate="45*(PI/180)"
llogan

7

2015年の v2.7リリースは、FFMPEGはデフォルトの動作を変更して、入力ビデオソースを「回転」メタデータで自動回転させました。

スクリプトまたはコマンドが2.7より古いffmpegリリースで実行されないことがわかっている場合、最も簡単な解決策は、メタデータに基づいてカスタムローテーションを削除することです。

その他の場合は、カスタムローテーションコードを保持して-noautorotateフラグを追加することにより、将来に備えて使用できます(これは、当時維持されていた古いバージョンでサポートされています)。


2

デコードバックエンドとしてffmpegを使用するメディアプレーヤーも、そのすべてのフィルターを利用できます。「オフセットとフリップ」フィルターを使用したこのスクリーンショットをご覧ください。ここに画像の説明を入力してください

または、動画を再エンコードする場合は、Stackoverflow でFFmpegを使用して動画を回転するをご覧ください。


1
残念ながら、FFmpegを使用したビデオの回転でtranspose参照されているフィルターは、私が知る限り180°回転しません。
-llogan

1
@LordNeckbeardは直接ではありませんが、2つのtransposeフィルターを連結して効果を得ることができます。
-evilsoup

1
@evilsoupああ、はい、私はそれを考えていませんでした。空間的推論は難しいです。買い物に行きましょう。例で私の答えを更新してください。
-llogan

1

以下は、「fixedFiles」の下のディレクトリ構造でファイルを出力するbashスクリプトです。iOSビデオを変換および回転し、AVIをトランスコードします。このスクリプトは、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

1

これを編集して、テキストの前書きをするように頼まれました。最終的に見つかった解決策がテキストの最後にあったことを示しています。そのため、最後に、ビデオを正しい方向に正常に回転させた2つの連続したffmpegコマンドが見つかります。その前のテキストは、できるだけ多くの情報を提供することを意図していました。情報不足のため拒否された他のメッセージを見たときと同じです。とにかく、これがffmpegを使用する他の人に役立つことを願っています。ffmpegでのhflipとvflipの目的は、少なくとも、混乱を招き、私が期待したものとは反対であるように思えます。

ファイルmerlin.movは、iphoneで撮影したビデオのコピーで、最初にDropboxにアップロードし、次にラップトップにダウンロードしてUbuntuを実行しています。

    $ 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

USB経由でiPhoneをマウントし、ファイルを直接コピーすることができたはずですが、それは機能しませんでした。私のラップトップはiphoneが接続されたことを認識しますが、そのファイルシステムをマウントせず、iphoneでラップトップを「信頼」するように促されませんでした。

Dropboxからラップトップにコピーするために使用したコマンドは次のとおりです。

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

元のファイルは、ビデオ1920 x 1080コーデックHEVC / H.265フレームレート30 /秒、ビットレート8140 kbps、オーディオコーデックMPEG-4 AACオーディオチャネルステレオ、サンプルレート44100 Hz、ビットレート85 kbpsです。iPhoneで再生すると、正しい向きになり、サウンドが同期されます。ラップトップのビデオで再生すると、上下が逆になり、水平方向に反転し、サウンドが同期されません。「ffmpeg -i merlin.mov」からの出力の一部を次に示します。

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

「ffmpeg -version」からの出力の最初の行は次のとおりです。

ffmpegバージョン3.3.3 Copyright(c)2000-2017 FFmpeg開発者

次の例では、再生がMPEG-4ビデオ(video / mp4)に変換され、サウンドが同期されますが、再生は垂直と水平の両方に反転します。

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

以下は垂直に反転しているため、再生は直立し、サウンドは同期され、MPEG-4に変換されますが、水平方向に誤って反転されたままになります(タイプミスではなく、「hflip」を指定しました)。

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

次の例では、水平方向を正しい方向に反転しましたが、再生は上下逆になりました

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

以下はまったく効果がないように見えました:

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

superuser.comで見つけたコマンドに基づいて、これも試しました。サウンドは正常に同期され、MPEG-4に変換されましたが、水平方向と垂直方向の両方が正しくありませんでした。

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

私もこれを試しましたが、向きを修正するという点でも機能しませんでした:

    ffmpeg -noautorotate -i merlin.mov merlinnoautorotate.mp4

次の2段階のプロセスは、最終的に必要なものを取得しました。垂直と水平の両方を反転し、サウンドを同期し、MPEG-4にフォーマットを変換します(これもタイプミスではありません。両方のコマンドでhflipを使用しました)。

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

長い間-これは私の答えのように見えます-彼は単に彼の問題解決プロセスを歩き回っています。
ジャーニーマンオタク

@JourneymanGeek確かにあなたは正しいです。私は彼の最後の段落を見ることができます 良い目。(私は本当に記事全体を読みましたが、たぶんそこに着いたときまでに私の目は輝いていました)。
私は

あなたの答えを改善する良い仕事。回答に十分な詳細を含めることができました。サイトをご覧になったら、他の良い回答が明瞭さと詳細のバランスをどのように取っているかを観察してみてください。
私は言うモナの復活

0

手順は次のとおりです。

  1. まず、QuickTimeでビデオファイルを開きます。最初にQuickTimeを起動し、「ファイル」に移動してから「ファイルを開く」に移動できます。または、ファイル自体を右クリックして「開く」を選択し、QuickTimeを選択することもできます。

  2. ビデオが開いたら、「編集」をクリックすると、すぐ下に回転および反転オプションが表示されます。

  3. 目的の向きをロックしたら、追加した新しい変更をビデオにエクスポートする必要があります。QuickTimeの[ファイル]メニューの下に[エクスポート]オプションがあります。

エクスポートするファイル設定を選択し、「OK」をクリックしてエクスポートを開始します。

エクスポート操作が完了すると、正しい方向で保存することを選択した場所に新しいファイルが見つかります!

この修正全体を完了するのに5分もかかりませんでしたが、ビデオの長さによっては、もっと長くかかる場合があります(または、短くなりますが、繰り返します)。

ブログソース


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

私のためにトリックをしました。転置フィルターが一度に180度回転する可能性を提供しない理由はわかりませんが、何でも。詳細については、ドキュメントをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.