FFMPEGでは、ビデオのサイズを変更する最も効率的な方法は何ですか?


2

4:3形式のmkvおよびmp4ビデオファイルの大規模なコレクションがあります。最大のサイズを、より管理しやすい640x480サイズに変更しようとしています。これは、ディスクスペースを節約することも、ラップトップ画面で視聴しやすくすること、および再生に使用するプロセッササイクルを少なくすることも目的の1つです。

しかし、私はそれらのサイズを変更する効率的な手段を見つけていません。MediaInfoによって報告された元のファイルに使用されているエンコーディングに厳密に準拠しようとしています(MediaInfoによって報告された変数を標準のプリセットとは異なる場所で再現するためにx264optsオプションを使用)。2パスビデオエンコーディングに基づきます。

しかし、これにより、以下に示すように、ffmpegの非常に複雑なコマンドが残ります。私は何を見落としていますか?ffmpegで使用できるもっと簡単なコマンドラインはありますか。それでも、入力ファイルで使用されているエンコーディングを再現するという公正な仕事をしますか?

::  Resize Image to 640x480 (e.g. 960x720 x 2/3)

::  Input File (WITH .ext)
SET input=video_960x720_320kbps.mkv

::  Resize from 960x720 to 640x480 (i.e. 960x720 x 2/3)

::  Resize Picture to 2/3rd
    SET multiply=2
    SET divide=3

::  Location of FFMPEG (64-bit)
SET ffmpeg="C:\Program Files\FFmpeg\ffmpeg.exe" -hide_banner -threads 1


::  *** MATCH INPUT FILE'S SETTINGS : Input file analysed by MediaInfo ***

::  **  Command Line : 2 Pass Encoding : 320 kbps x 2/3 + Headroom = 240 kbps : Input = MKV  **

::  Video - Advanced Video Codec (AVC), High@L5 - Constant Bitrate, Framerate defaults to Input file's framerate

::  Overwrite a Profile with the x264-params option
SET x264opts="ref=16:deblock=1,1,2:me_range=32:trellis=0:bframes=5:open_gop=0:min-keyint=300:keyint_min=23:bitrate=240:qpmin=12:qpmax=60:qpstep=10:threads=1"

SET mapping=-i "%input%" -itsoffset 0 -i "%input%"  -map 0:v -map 1:a  -copyts
SET options=-preset veryslow  -profile:v high -level 5 -x264-params %x264opts%  -pix_fmt yuv420p
SET command=%ffmpeg% %mapping% -c:v libx264 %options% -vf "scale=iw*%multiply%/%divide%:-1" -c:a copy  -sn  -map_metadata 0
%command% -y -pass 1 -flags global_header -f matroska nul  &&  %command% -pass 2 -flags global_header -movflags faststart "output_640x480_240kbps.mkv"

回答:


2

使用するエンコーディングを再現する」という意味はありません。これは単なる履歴情報であり、同じ設定を使用しても、再エンコードの効率は向上しません。プロセッサの負荷を減らしたい場合は、低いプロファイルを使用してください。refs=16そして、より少ないプロセッササイクルbframes=5消費するのとまったく逆になります。シングルパスCRFは、2パス平均ビットレートモードを必要としません。

また、入力を2回取り込み、0(!)のTSオフセットを適用します。どうして?

ffmpeg -i in -vf scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p -c:v libx264 -crf 22 -profile:v main -c:a copy -sn -map_metadata 0 out.mkv

入力が正確に4:3の場合、パッドフィルターを省略できます。

結果のサイズが大きすぎる場合は、CRF値を増やします。


返信いただきありがとうございます。おそらく、私は自分自身をひどく表現しました。再エンコードプロセス自体をより効率的にしようとはしていません。最終的には、はるかに大きな元のファイルを再生するよりも少ないリソースで再生できるように、小さなファイルになりたいだけです。出力ファイルが入力ファイルに品質的に最も似ているように、元のエンコードパラメーターを保持しようとしています。しかし、私はffmpegコマンドラインを簡素化したいです。コマンドラインを表現するのにそれほど面倒ではない方法があることを願っています。
Ed999

たとえば、ffmpegは入力ファイルでエンコードされた元のパラメーターを使用できますか?現在、MediaInfoを使用して入力ファイルを分析し、コマンドラインを変更して、これらを手動で取得しています。
Ed999

2パスエンコードを使用した場合、より良い圧縮(毎回小さい出力ファイル)が得られることが最終的に実証されているため、2パスモードを使用しています。また、0の '-itsoffset'を '-tscopy'オプションおよび '-map'オプションと組み合わせて含めることにより、入力ファイルのすべてのタイムスタンプを出力ファイルに強制的にミラーリングさせます。これにより、正確に同期した出力ファイルが得られますが、もちろん、入力ファイルが同期していない場合、正確に同期していない出力ファイルになります!(後者の場合、これらのオプションを省略するオプションがあります。)
Ed999

1
小さいファイルになります ->ファイルサイズは、リソース負荷の決定要因の1つです。現在の設定では、最も面倒な設定ではありません。refs = 16ははるかに大きな貢献者です。いずれにせよ、ファイルサイズを小さくするには、CRFを増やします。元のエンコードパラメータを保持します ->それはエンコーダの動作方法ではありません。一つには、あなたのソースは元のソースと同じではありません。エラー残差は異なるため、x264optsでのqpのクランプは次善の可能性があります。me_rangeは、第2世代のエンコードには不必要に高すぎる可能性があります。
ギャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.