ffmpegでビデオのサイズを縮小するにはどうすればよいですか?


201

ffmpeg品質を下げることでビデオのサイズを小さくするにはどうすればよいですか(当然、可能な限り最小限にしますが、使用可能なスペースがあまりないモバイルデバイスで実行する必要があります)。

私はまだ一つのことを書くのを忘れていました。ビデオで字幕(* .srtまたは* .sub)を使用できる場合、変換されたビデオファイルのパラメーターに合わせて字幕も変換したいと思います。


4
私はそれを使用していませんが、ffmpegmanページ-fsに出力サイズを制限するオプションが表示されますffmpeg -i in.avi -fs 100M out.avi
ケビン

1
manページにリダイレクトしませんman ffmpeg | wc -l --> 5254

3
これ.aviは主な問題ではありません。aviただのコンテナです。主な問題は、どのコーデックを使用するかです。多くの(ほとんどの?).aviビデオは、古いスタイルのコーデック(XviDなど)を使用しますが、後の世代のコーデックと比較すると同じ品質で大きくなります。H.264ビデオ圧縮標準(例:codec x264)を使用したタイトなエンコードaacとオーディオの圧縮..使用するコンテナとコーデックは、ユーザーと携帯電話次第です... .mp4コンテナは受け入れられます..(ただし、携帯電話で処理できます:このリンクを
-Peter.O

@Kevinこれは、変換用のパラメーターをさらに必要とします。
xralf

@hesseどういう意味ですか?
xralf

回答:


277

この回答をご覧ください。便宜上、以下に引用されています。

1 GBをビデオの長さ(秒単位)で割って、必要なビットレートを計算します。したがって、長さが16:40(1000秒)のビデオの場合、1000000バイト/秒のビットレートを使用します。

ffmpeg -i input.mp4 -b 1000000 output.mp4

検討する価値のある追加オプションは、一定ビットレートの設定です。これにより、平均ビットレートは低下しますが、品質は向上します。18から24の間でCRFを変更します—低いほど、ビットレートは高くなります。

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

必要に応じてコーデックを変更します-libx265が利用できない場合、libx264が利用可能になりますが、結果としてファイルサイズが若干大きくなります。


サイズ338 MBのビデオは、サイズ130 MBに縮小されました。品質は急速に低下しました。このプロセスの説明はありますか?原作者は彼のガイドラインを説明していません。
xralf

13
2番目のコマンドは、使用-crf 24して255.3MBのビデオを取り、品質を著しく低下させることなく72.7MBに減らしました。賛成票を投じてください!
パトリックロバーツ

2
〜2Gのビデオを14MBに縮小しましたが、まだ見栄えがよく、これが最初の検索結果であり、まさに私が探していたものです、ありがとう!
sinisterstuf

5
libx265さらなるサイズ削減に使用できるようになったことに注意してください。
-ZN13

6
使用済みffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi。100MBのビデオを9MBに縮小しました。ビデオ品質の変化はほとんどありません。ありがとうございました!
alpha_989

32

特定のビットレートを探しているのでなければ、この-crfオプションをお勧めします。これは、x264エンコードに最も一般的に使用されてい ます:http : //slhck.info/articles/crf

要するに、CRFが23の場合、「DVD」品質のムービー(〜700MB-1GB)が作成され、CRF値が低いほど高品質(大きなファイル)になります。


3
外部のWebサイトにリンクする代わりに、完全なコマンドの例を示してください(いつかは壊れる可能性があります)
Jake Berger

1
@Vicky Chijwaniは、上記の例のコードを提供します。これはコメントに適していますが、このサイトでの最初のアクティビティでした。リンクにはcrfオプションに関する詳細な説明がありますが、コードを機能させるために必要なわけではありません。
トム・ケリー

27

あなたは、ファイルサイズを小さくして、より多くのビデオをモバイルデバイスに収めたいと言っていましたが、これも私のユースケースです。ここでの答えはすべて、圧縮品質を下げるためのものですが、ビデオフレームサイズを減らすことについて誰も言及していません。私の経験では、再圧縮するよりも約3倍から5倍速いです。詳細については、スケーリングに関するffmpegのドキュメントを参照してください。

ffmpeg -i input.mkv -vf "scale=iw/2:ih/2" half_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/3:ih/3" a_third_the_frame_size.mkv
ffmpeg -i input.mkv -vf "scale=iw/4:ih/4" a_fourth_the_frame_size.mkv

20

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

(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-角度付き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倍高速でした。これは、他のすべての方法がビデオの実際の長さよりも変換に時間がかかったため、高解像度ビデオでは非常に問題になることがあります!たとえば、(CR)メソッドは21分のビデオを変換するのに53分かかりました。

  • (SZ)メソッドは、ビデオの定義がそれを表示する画面の定義よりも大きい場合、間違いなく最良の方法です。たとえば、電話機で1080pの画像しか表示できない場合、3840x2160のビデオを送信するだけでも無駄です。サイズを半分にして1080pにするのが最適です。

  • 提案された回答のいくつかは、実際にいくつかのビデオのサイズを増やしました。たとえば、(BR)メソッドは1080pサンプルのサイズを2倍以上にしました。ただし、2160pサイズは3分の1になりました。高解像度サンプルの場合、(CR)、(BL)、および(DF)メソッドはすべてビデオのサイズを大きくしました。

正しい(または最良の)回答

最初に、ターゲットディスプレイでサポートされている最大値まで解像度を下げることをお勧めします。

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

  • それがあなたに関係のないものでない場合は、解像度をさらに下げることができます。

  • ビデオに高速アクションシーンが含まれていない場合は、フレームレートを下げることができます。

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

  • ビットレートは、複数の要素の組み合わせです。したがって、ffmpegにビットレートを下げるように指示するだけでは、希望する結果が得られない場合があります。

  • 情報量を減らすもう1つの方法は、色深度を下げることです。これを行う方法はまだ議論されていません。


13

オプションなしで実行した場合、ffmpeg すでにいくつかの最適化を実行しているように見えるので、理解できない設定を使用する前に、または明示的に情報を失うことを決定する前に、デフォルトの変換を試してください:

ffmpeg -i input.mp4 output.mp4

私の場合、ビデオとオーディオの両方のビットレートを下げて(入力ファイルと出力ファイルを実行することで確認および比較できffprobeます)、700 Mbのビデオを一見類似の品質の60 Mbに変換しました。


1
これで4Gbから2Gbになりました、ありがとう!!
サムホセニー

1
(10Moから1.2Mbに、ffmpegはVP8からVP9にあった私のビデオを自動変換しました)
sodimel

これにより、ビデオのサイズが10.8MBから14MBに増加しました
pjtnt11

3

古いカメラが生成するMotion JPEGビデオ(各フレームはJPEGイメージ全体であるため非常に大きなビデオです)をh264に変換するために、元々自分で作成したレシピがあります。他の種類のビデオ(コースなど)に適応します。

私はffmpegではなく、mplayerとmencoder を使用します。まず、mplayerでオーディオを分離する必要があります。

mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
  • パラメータのビデオを抽出しないようにのmplayerを伝えます。-vo null-ao null

次の手順では、mencoderを使用して3パス圧縮を行います。最初のパスでは、適切な一定品質モードの圧縮(crfパラメーター)を開始点として選択します。

mencoder <video> -ovc x264 \ 
         -x264encopts ratetol=100:preset=veryslow:crf=<value>:pass=1 \
         -nosound -o video1.h264
  • ビデオの最終的な品質に不安がある場合は、slow_firstpassパラメーターを-x264encoptsに追加できます。Mencoderのマニュアルでは、このオプションを使用すると、「最終パスの品質にほとんどまたはまったく影響を与えずにエンコード速度を大幅に改善する」パラメーターが無効になるとされています。したがって、最後のステップでのみ使用してください。

  • crfにはいくつかの値を試す必要があります。25から始めて、結果のビデオでアーティファクトに気付くまで値を増やしていきます(値が大きいほど圧縮率が高くなります)。後続のエンコードパスにより、crfに選択した品質が向上することに注意してください

  • 以下のための代替veryslowのプリセットです遅く遅くメディアなどの完全なリストについては、mencoderのマニュアルを参照してください。

  • ratetolはビットレートの変動を制御します。ここで正しいことをしているかどうかはわかりませんが、メンコーダーが各シーンに適切なビットレートを選択できるように最大値に設定します。

最初のパスの後、最後の行は次のステップで使用する平均ビットレートを示していることに注意してください。

(...)
x264 [info]: kb/s:526.43

最初のパスで推奨されるcrfパラメーターを、後続のパスで必要なビットレートに変更します。

mencoder <video> -ovc x264 \
       -x264encopts slow_firstpass:ratetol=100:preset=veryslow:bitrate=526:pass=3 \
       -nosound -o video2.h264

この2番目のパスエンコーディングは、圧縮を最適化するために、最初のパス(divx2pass.logおよびdivx2pass.log.mbtree)で生成された統計を読み取ります。

  • 最初のパスで生成されたものではなく、同じビデオ入力を使用することに注意してください。最初のパスの出力ビデオは、初期品質の確認にのみ役立ちます。

  • ことにも注意してくださいpass=3ない pass=2あなたが最後のステップにしたい何度でも繰り返すことができますので、)新しい統計ファイルを生成します。私は通常pass=32回行い、常に結果ビットレートに注意を払います。

その間、lameまたはを使用して音声を圧縮することもできますoggenc

oggenc -q<n> <audio_pcm.wav>

最後に、オーディオとビデオを削除します

mencoder -audiofile <audio>.ogg video2.h264 -oac copy -ovc copy \
         -of lavf -lavfopts format=mp4 -o <video>.mp4
  • -of lavf -lavfopts format=mp4生成mp4lavoptsのミュクサーを使用してファイル形式。

3

40分間のHDビデオプレゼンテーションを505MBから183MBに圧縮しました
。これは100MB→36MBのようです。
元のビデオはHDで、出力はほとんど差がありませんでした。
それはビデオファイルです。「私は持ち続けたいのですが、HDはやりすぎです。」
以下が理由で使用したコマンドです。

ffmpeg -n -loglevel error -i inputfile.mp4 -vcodec libx264 -crf 28 -preset faster -tune film outputfilename.mp4

  • -n:出力ファイルの上書きを回避します(テストしてからバッチ処理する方が安全です)
  • -loglevel error :エラーを表示し、進行中の行と行を非表示にします
  • -i inputfile.mp4 :入力ファイル名
  • -vcodec libx264上記トップの回答からスワイプしました
  • -crf 28:マイナー顕著な違いを有する単一パス圧縮(「0 =無損失、23 =デフォルト、51 =最悪;主観的正気範囲は17-ある28REFドキュメント
  • -preset faster:「中」のデフォルトのエンコード時間よりも早く2倍に見える参照ドキュメント
  • -tune film:入力がHQビデオであることを指定します(他のオプションには「漫画」、「静止画像」が含まれます。)ref docs
  • outputfilename.mp4 :出力ファイル名

ビデオファイルのディレクトリの場合:

for i in *.{avi,flv,m4v,mov,wmv,mp4,MP4,TS,mkv}; do ffmpeg -n -loglevel error -i "$i" -vcodec libx264 -crf 28 -preset faster -tune film "cc${i}"; done

問題点:

  • コマンドにすべての拡張子を付けずに「すべてのビデオファイル」を収集する、よりクリーンな方法
  • 「cc」プレフィックスなしでファイル名を出力し、削除する前にビデオを確認できるクリーンな方法
  • .webmファイルはコマンドでは機能しません。交換する必要があった"cc${i}""${i%.*}.mp4"

Handbrakeは、UIを備えたオープンソースの代替手段です


できます。しかし、時間がかかりすぎます。実行時間を短縮するための改善はありますか
Nirali


1

ビデオのサイズを縮小し、自動的に異なるcrf値を試すためのbashスクリプトを作成しました。

基本的にあなたは

  • crf値の範囲を選択します
  • スクリプトを実行する
  • 生成されたビデオのサイズを確認し、必要なものを選択してください

これは、達成したいサイズ制限があり、それを可能にするcrf値がわからない場合に非常に便利です。

これが誰かの助けになることを願っています。私は同僚と共有し、誰もがそれが役に立ったと感じました。

#!/bin/bash

# bigger values of crf will lead to a bigger compression (smaller video size)
#for i in 1 2 3 4 5
for i in {25..28}
do
# you can remove the option -y if you want to be asked if to overwrite a file with the same name (leave the -y only if you understand what you are doing, otherwise you might rewrite an important file)
   ffmpeg -y -i NAMEOFTHEVIDEOTOCOMPRESS.mp4 -c:v libx264 -crf $i -preset veryfast -profile:v baseline -level 3.0 -strict -2 out_$i.mp4
   printf "\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Done compression at crf=$i \n\n"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.