品質を維持しながらffmpegを使用して4kを1080pにダウンサンプリングする方法は?


20

MP4形式の4K 3840x2160映像を1080pに下げる必要があります。走ってみた

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

しかし、結果は非常に質が悪く、画像全体が正方形の「タイル」で構成されており、4:1に拡大しているかのようです。

このコマンドの実行結果は次のとおりです。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

私はffmpegが優れたツールであることを経験から知っているので、どういうわけかオプション/パラメーターを台無しにしなければなりません...

これどうやってするの?


コマンドからの完全で完全なコンソール出力を表示してください。短いセグメントをエンコードするだけなので、追加-t 10して10秒の出力を作成します。なぜダウンスケールしたいのですか?スケーリングされた出力のユースケースは何ですか?この情報は、より正確な回答を提供するのに役立ちます。
-llogan

@LordNeckbeardコンソール出力を追加しました。これらのクリップを私と一緒に作業している人々とより簡単に共有できるように、ダウンスケールしたいと思います。
ララマイケルズ

1
-c:a copyオーディオストリームを再エンコードしたくない、または再エンコードする必要がないため、忘れないでください。-map 0チャプタメタデータなどのコピーに使用します。(ffmpegは、デフォルトで1 vid + 1 audのみを取ります。)
ピーターコーデス

1
また、-sws_flags lanczos+print_infoデフォルト(双線形と思います)よりも優れたスケーリングアルゴリズムを使用します。stlbの答えは、プロセスのビデオエンコーディング部分について説明しています。
ピーターコーデス

2
@PeterCordesまたは、scale=1920:-2:flags=lanczos。また-2、実在しない答えの中でスケールについて言及するつもりでした。あなたが置くことができるかわからない人のために-2幅または高さで、アスペクト比を維持しながら、それは自動的に正しい値を提供します(YUV420P出力用libx264で必要)2で割り切れる値を作ります。
llogan

回答:


17

ffmpegのデフォルト設定は非常に低品質であり、コーデックまたは品質パラメーターを指定しないので、デフォルトを使用しているだけです(フォーラムで多くの質問が生成されるため、開発者がそれを修正しない理由はわかりません)どこにでも)。

編集:デフォルトは非常に健全です。ffmpegの最近のビルドでは、使用可能な良好な結果を得るために入力ファイルと出力ファイル以外のものを指定する必要はありません。もちろん、あなたの心の欲望に微調整することができます。

-c:v libx264 -crf 20 -preset slowコマンドに追加してみてください。

  • -c:v libx264 libx264エンコーダーを使用するように指示し、
  • crf 20 20の値を持つ固定レート係数量子化器(逆説的には可変ビットレートですが一定の品質を意味します)を使用します(かなり良い品質。低いほど高品質/大きなファイル、高いほどクラッピー/小さい)。
  • slowプリセットは、デフォルト(媒体)よりもそれにもう少し力を入れ手段はエンコーダ設定の束のショートカットです。

これらの設定を調整できます。どのノブを調整するかについては、h.264エンコーディングガイドを参照してください。

オーディオをそのまま使用している場合は、を追加しc:a copyます。これにより、再エンコードせずにオーディオストリームをそのままコピーできます。


デフォルトはエンコーダーによって異なります。libx264は通常デフォルトでMP4出力に使用され、追加オプションなしで素晴らしい品質の出力を生成しますが、質問のffmpegビルドはこのエンコーダーをサポートしていないようであるため、mpeg4MPEG-4 Part 2ビデオを生成する古代のエンコーダーを使用します。その全盛期のデフォルトはより健全でした(320x240など)。
-llogan

libx264がデフォルトになったと聞いてうれしいです。
stib

私は、CRF 20はかなりあると言うだろうくそ良いです。18は機能的にロスレスです。私は23で自分の動画のほとんどを行う
user24601

私の作品のほとんどは、SDカードからローカルで動作する再生デバイスに表示されます。サイズをあまり最適化する必要はないので、品質はできるだけ高くします。同意します。Webで配信している場合は、ダイヤルダウンします。
STIB

これは私を助けませんでした。ビデオのどこで動きが起こっても、私はまだブロック状の奇妙さを持っています。低速にプリセットされた18のcrf。2.7k-> 1080p。
-rewolf

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