ffmpegを使用してビデオサイズを縮小する方法は?

ffmpegを使用してビデオサイズを縮小する方法は?

どうやって使うの?ffmpeg品質を下げてビデオサイズを小さくしますか? (空き容量が少ないモバイルデバイスで実行する必要があるため、当然のことながら可能な限り小さいサイズで)?

動画で字幕(*.srtまたは*.sub)を使用できる場合は、変換した動画ファイルに適したパラメータに変換したいことに注意してください。

答え1

2020年更新:この回答は2009年に作成されました。 2013年以降、H.264よりも優れたビデオフォーマット、つまりH.265が広く使用されています(同じ品質でより多くの圧縮を行うか、同じサイズでより高い品質を提供するという点で優れています)。これを使用するには、libx264コーデックをlibx265に置き換えてCRF値を増やす(4または6の追加など)、圧縮レバーをさらにスライドさせる必要があります。 H.265の合理的な範囲はおそらく24〜30であろうからです。参考にしてください減らすCRF値は次のとおりです。高いビットレートにより高い高品質のビデオ。

ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4

libx265 を指定することもできます。基本、これはファイルサイズと品質に影響します。


以前のH.264形式を使用して適用されたこの技術については、以下を参照してください。この回答、便宜上、次のように引用されます。

ターゲットサイズ(ビット単位)をビデオ長(秒単位)で割って必要なビットレートを計算します。たとえば、ターゲットサイズは1 GB(1 GB)です。バイト、つまり8GBです。少し)および10,000秒のビデオ(2時間46分40秒)、800,000ビット/秒(800kbit / s)のビットレートを使用する:

ffmpeg -i input.mp4 -b 800k output.mp4

考慮すべき他のオプションは次のとおりです。一定の比率要素、これは平均ビットレートを下げますが、より良い品質を維持します。 CRFを18から24の間に変更します。低いほど、ビットレートは高くなります。

ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4

答え2

モバイルデバイスにさらにビデオを追加するためにファイルサイズを縮小したいと言っていましたが、これが私のユースケースです。ここにあるすべての答えは圧縮品質を減らすことですが、ビデオフレームサイズを減らすことについては誰も言及していません。はるかに高速で、ソースによっては最大数倍速く、エンコードするピクセル数が少ないため、解像度は低くなります。その結果、ファイルサイズを大幅に削減できます。

欠点は、ピクセル数が少ないということは、画像の詳細な描写が少ないことを意味するので、品質も非常に低下することである。ただし、コンパクトなデバイスに変換する場合はこれを許可できます。

FFmpegのドキュメントをご覧くださいズームより多くの情報を知りたいです。

半分のサイズに調整するには:

ffmpeg -i input.mkv -vf "scale=trunc(iw/4)*2:trunc(ih/4)*2" half_the_frame_size.mkv

1/3サイズ:

ffmpeg -i input.mkv -vf "scale=trunc(iw/6)*2:trunc(ih/6)*2" a_third_the_frame_size.mkv

クォーターサイズ:

ffmpeg -i input.mkv -vf "scale=trunc(iw/8)*2:trunc(ih/8)*2" a_fourth_the_frame_size.mkv

5分の1サイズ:

ffmpeg -i input.mkv -vf "scale=trunc(iw/10)*2:trunc(ih/10)*2" a_fifth_the_frame_size.mkv

この例では、ピクセルサイズが一部のコーデック(H265を含む)が必要とする2の倍数になるように、サイズを値の2倍に分割して2を掛けます。

-2また、あるパラメータから特定のサイズにサイズ変更し、別のパラメータに対して同じサイズを自動的に維持することもできます。たとえば、一方向の360ピクセルは次のようになります。

-vf "scale=-2:360"

解像度の変更に注意してください。いつも録音が必要なため、他の回答のすべてがここにも適用され、これらの例はH265オプションと互換性があります(例:-c:v libx265 -crf 28。 

答え3

この質問に提案されている他の答えのほとんどをテストしました。テストデータの結論は次のとおりです。私がテストした提案の答えは次のとおりです。

(BR)ビットレートを変更するには、次を使用します。

ffmpeg -i $infile -b $bitrate $newoutfile 

(CR) 固定率要素を変更するには、次のようにします。

ffmpeg -i $infile -vcodec libx264 -crf 23 $outfile

(SZ)ビデオ画面のサイズを変更するには(たとえば、ピクセルサイズの半分)、次のようにします。

ffmpeg -i $infile -vf "scale=iw/2:ih/2" $outfile

(BL) 次のコマンドを使用して、H.264 プロファイルを「基準」に変更します。

ffmpeg -i $infile -profile:v baseline $outfile

(DF) デフォルトの ffmpeg 処理を使用するには、次のようにします。

ffmpeg -i $infile $outfile

データ

  • 「サイズ」 - 元のビデオに基づいて変換されたビデオのピクセルサイズの割合。
  • 「ビットレート」 - 元のビデオと変換されたビデオのビットレート。
  • 「定義」 - ビデオのピクセルサイズです。
  • 「変換」 - ビデオを変換するのにかかる時間(秒単位)。

提案された方法を用いて(BL)の目標ビットレートを計算した。

===ファイルA - ノードがAngular-Fnbixa7Ts6M.mkvに電力を供給する方法===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        64152 kb    214%       76%        40%        83%        76%
bitrate     411 kb/s    883        313        165        342        313
definition  1920x1080   1920x1080  1920x1080  960x540    1920x1080  1920x1080
convert     --          648        509        225        427        510

===ファイルB - AngularでGraphQLを使用_作成者:Lee Costello-OGyFxqt5INw.mkv ===

            original    BR         CR         SZ         BL         DF
            --------    ---        --         --         --         --
size        410301 kb   33%        109%       28%        143%       109%
bitrate     2687 kb/s   880        2920       764        3843       2920
definition  3840x2160   3840x2160  3840x2160  1920x1080  3840x2160  3840x2160   
convert     --           2307       3188       1116       2646       3278

結論として

  • (SZ)方法は確かに最速の方法です。 2~4倍速いです。他のすべての方法は、ビデオの実際の長さよりも変換するのに時間がかかるため、これはHDビデオの場合に大きな問題になる可能性があります!たとえば、(CR)方式では、21分の動画を変換するのに53分かかりました。

  • ビデオの解像度がビデオが表示される画面の解像度より大きい場合(SZ)方法が最善の方法です。たとえば、携帯電話が1080pの写真しか表示できない場合、3840x2160のビデオを送信するのは無駄です。サイズを1080pに半分に縮小することをお勧めします。

  • 提案された回答の一部は、実際には一部の動画のサイズを大きくします。例えば、(BR)法は、1080pのサンプルサイズを2倍以上増やす。ただし、2160pサイズは1/3に縮小されます。 HD サンプルの場合、(CR)、(BL)、(DF) 法はすべてビデオサイズを増やします.

正解(または最良)回答

まず、ターゲットモニタがサポートする最大解像度に解像度を下げることをお勧めします。

ファイルサイズをさらに小さくしたい場合は、個人の選択に依存します。情報の内容を減らしたり圧縮を増やしたりできます。

  • 心配しない場合は、解像度をさらに下げることができます。

  • ビデオにクイックアクションシーンが含まれていない場合は、フレームレートを下げる必要があります。

  • 強力なプロセッサがあり、スペースが唯一の問題である場合は、圧縮率を上げることができます。

  • ビットレートはいくつかの要因の組み合わせです。したがって、ffmpegにビットレートを下げるように指示するだけでは、望ましい結果が得られない可能性があります。

  • 情報内容を減らす別の方法は、色深度を減らすことである。これを行う方法は議論されていない。

答え4

特定のビットレートを探していない限り、この-crfオプションをお勧めします。

x264これは、で説明されているように、エンコードに最も一般的に使用されます。この記事

存在する短い:CRF(Constant Rate Factor)23はDVD品質の映画(〜700MB - 1GB)を生成し、CRF値が低いほど品質が高くなります(大ファイル)。

リンクされた記事の例:

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

関連情報