回答:
この回答をご覧ください。便宜上、以下に引用されています。
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が利用可能になりますが、結果としてファイルサイズが若干大きくなります。
-crf 24
して255.3MBのビデオを取り、品質を著しく低下させることなく72.7MBに減らしました。賛成票を投じてください!
libx265
さらなるサイズ削減に使用できるようになったことに注意してください。
ffmpeg -i input.avi -vcodec libx264 -crf 24 output.avi
。100MBのビデオを9MBに縮小しました。ビデオ品質の変化はほとんどありません。ありがとうございました!
特定のビットレートを探しているのでなければ、この-crf
オプションをお勧めします。これは、x264
エンコードに最も一般的に使用されてい ます:http : //slhck.info/articles/crf
要するに、CRFが23の場合、「DVD」品質のムービー(〜700MB-1GB)が作成され、CRF値が低いほど高品質(大きなファイル)になります。
あなたは、ファイルサイズを小さくして、より多くのビデオをモバイルデバイスに収めたいと言っていましたが、これも私のユースケースです。ここでの答えはすべて、圧縮品質を下げるためのものですが、ビデオフレームサイズを減らすことについて誰も言及していません。私の経験では、再圧縮するよりも約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
この質問に対する他の提案された回答のほとんどをテストしました。テストデータの結論は以下のとおりです。これらは私がテストした提案された答えです:
(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つの方法は、色深度を下げることです。これを行う方法はまだ議論されていません。
オプションなしで実行した場合、ffmpeg
すでにいくつかの最適化を実行しているように見えるので、理解できない設定を使用する前に、または明示的に情報を失うことを決定する前に、デフォルトの変換を試してください:
ffmpeg -i input.mp4 output.mp4
私の場合、ビデオとオーディオの両方のビットレートを下げて(入力ファイルと出力ファイルを実行することで確認および比較できffprobe
ます)、700 Mbのビデオを一見類似の品質の60 Mbに変換しました。
古いカメラが生成するMotion JPEGビデオ(各フレームはJPEGイメージ全体であるため非常に大きなビデオです)をh264に変換するために、元々自分で作成したレシピがあります。他の種類のビデオ(コースなど)に適応します。
私はffmpegではなく、mplayerとmencoder を使用しています。まず、mplayerでオーディオを分離する必要があります。
mplayer -vo null -ao pcm:fast:file=<audio_pcm.wav> <video>
-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=3
2回行い、常に結果ビットレートに注意を払います。
その間、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
生成mp4
lavoptsのミュクサーを使用してファイル形式。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-ある28」)REFドキュメント-preset faster
:「中」のデフォルトのエンコード時間よりも早く2倍に見える参照ドキュメント-tune film
:入力がHQビデオであることを指定します(他のオプションには「漫画」、「静止画像」が含まれます。)ref docsoutputfilename.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
問題点:
.webm
ファイルはコマンドでは機能しません。交換する必要があった"cc${i}"
→"${i%.*}.mp4"
品質を大幅に低下させることなく、指定されたファイルサイズ(ビットレート)内でビデオを「合わせる」には、2パスエンコーディングを使用する必要があります。これは非常に詳細なトピックです:http : //web.archive.org/web/20171130050515/http : //www.mpabo.com/2014/12/14/ffmpeg-and-x264-encoding-guide/
ビデオのサイズを縮小し、自動的に異なるcrf値を試すためのbashスクリプトを作成しました。
基本的にあなたは
これは、達成したいサイズ制限があり、それを可能にする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
ffmpeg
manページ-fs
に出力サイズを制限するオプションが表示されますffmpeg -i in.avi -fs 100M out.avi
。