FFmpegを使用してH264ビデオの品質を下げるが、H264形式のままにするにはどうすればよいですか?


8

私はビデオ編集の完全な初心者なので、とんでもないことを求めたら許してください。

セットトップレコーダーボックスからビデオクリップを取得しています。クリップはAVIファイルです。

Resolution: 1920 x 1080
Frames Per Second: 60
Video Format: ITU H.264
Audio Format: MPEG 1 Audio, Layer 3 (MP3)

解像度とFPSは私が必要とするものをはるかに超えているため、物事を縮小するコマンドを実行しようとしています。

ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi

これにより、希望する解像度、フレームレート、低いファイルサイズが得られますが、予想よりも品質が大幅に低下しました。

新しいファイルを調べたところ、なんらかの理由でFFmpegが使用する形式を変換していることがわかりました。

Video Format: FFmpeg MPEG-4
Audio Format: MPEG 1 Audio, Layer 2

入力形式と同じ出力形式を使用しない理由は不明です。このコマンドを使用して、H.264を使用するように強制しようとしました。

ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi

残念ながら、次の出力で失敗しました:

ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
  built on Jan  4 2012 16:21:50 with gcc 4.6.1
  configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  WARNING: library configuration mismatch
  avutil      configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avcodec     configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avformat    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avdevice    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avfilter    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  swscale     configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  postproc    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  6. 0 / 53.  6. 0
  libavformat  53.  3. 0 / 53.  3. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
Input #0, avi, from 'highres.avi':
  Metadata:
    comment         : Quality_GOOD
    encoder         : Lavf52.64.2
    encoded_by      : AverMedia_c281_1.7.2
  Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
[buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4
[libx264 @ 0x8f0fb40] broken ffmpeg default settings detected
[libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x8f0fb40] speed presets are listed in x264 --help
[libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high
Output #0, h264, to 'lowerresforceh264.avi':
    Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

なぜこれができないのか分かりません。「ffmpeg -formats」を実行すると、h264が入力と出力の両方に使用できるものとしてリストされました。

誰かが私を正しい方向に向けることができれば、私はそれを大いに感謝します。ありがとう。

PS:Ubuntu 11.10でFFmpegバージョン0.7.3-4:0.7.3-0を使用しています。

編集

プリセットの使用に関するソリューションを見つけました。プリセットに関する情報を探した後、私はそれらを議論する次のチュートリアルを見つけました:

http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html

私はコーデックと適切なプリセット設定を指定する必要があるだけです:

ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi

まだ調整の余地がありますが、基本的にはこれが私が望んでいたことです。ありがとう。


もちろん、Avermedia .aviファイル.mp4を変換してMountain Lion / Mavericksで再生する方法を知りたい人もいます<pre> ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 </ pre>

回答:


3

手伝おうとしています。まず、なぜFFMPEG H.264が入力形式ではないのか理解できません。

私はFFMPEGコマンドラインをよく知りません(知っている人はいますか?;))。マルチパスエンコーディング用のスイッチが必要です。私はあなたがおそらく使用でき、ほぼ確実にあなたが目指していることを行うことができるいくつかの組み込みのプリセットがあることを知っています。これらは通常、x264プリセットまたはx264チューンと呼ばれます。そのようなものを見つけることができますか?


ありがとう。プリセットについてのあなたの話は、私が可能な解決策を見つけるのに役立ちました。投稿を編集して、自分がしたことを表示します。
BigBeagle 2012

素晴らしい解決策。スニペットのコレクションに追加されました。ありがとう。
ゼット

2
@BigBeagle:質問に対する回答を見つけたら、回答として投稿できます。質問の編集は、質問をより明確にするために行われます。私が理解しているように、回答は回答セクションにあります。
ナビゲーション

8

ffmpegはx264プリセットを削除したため、-vpre設定は機能しなくなりました。

これで、ビデオファイルを私の携帯電話が処理できる形式に変換するためのスクリプトがあります。

ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv

各オプションについて説明します

-sws_flags lanczos+accurate_rnd このオプションはダウンスケーリングアルゴリズムです。ぼかさずにアーティファクトを最小限に抑えますが、速度が遅いため、lanczosをお勧めします。

-vf "scale=..." 出力解像度を指定する自明です

-crf 20これは品質で、20は最終出力(編集前に使用しないでください)の出力設定です。これは一定の品質であり、ファイルサイズがタイトでない場合に最適なオプションであり、他のファイルサイズよりも低いファイルサイズでより良い品質が得られます。それ以外の場合は、特定のファイルサイズ(CDまたはDVDに収める必要があるなど)で最高品質を得るために2パスを使用します。固定ビットレート(例-b 2000k)はストリーミング時にのみ使用する必要があります。特殊なケースは「0」であり、ロスレスであり、このオプションの範囲は、1(最高品質)〜50(最低品質)です。

このための適切なテストは、-crf 20を使用してエンコードを実行し、ビットレートに注意して、それを使用して、ファイルの2番目のバージョンの-b設定が両方とも同じファイルサイズであることを確認し、品質を比較します。違い。

-preset veryslow これにより、使用するCPUの量が選択されます。遅いほど、ファイルサイズが小さくなり、品質が向上します。

-profile:v mainこれは、使用するH.264プロファイルです。高は最も効率的なファイルサイズですが、他の形式に比べてデコードに多くのCPUを使用します。ほとんどの携帯電話にはハードウェアデコーダーが組み込まれていて、フラッシュプレーヤーがサポートしているため、最も人気があると言われています。メインを使用します。

-tune fastdecode 私の携帯電話はこのオプションなしでファイルを再生するのが好きではありませんが、通常は空白のままにするか、ビデオゲームの場合は「フィルム」に設定できます。これを使用する主な理由は、少し品質を上げるためです。

そして、私が最新のコンテナ形式を使用することを強くお勧めします.aviはH.264を保持するように設計されていません。問題がある場合は、mkvまたはmp4を使用してください。


libx264のためのプリセットは、今で指定されている-presetのように-preset slow
STIB

-tune fastdecode非ブロック化、重み付きBおよびPフレーム、およびCABACを無効にします。Bフレームは処理できるが、CABACは処理できないデコーダーはありますか?-profile:v baseline古いハードウェアデコーダをターゲットにする必要がある場合は、をお勧めします。(fastdecodeハードウェアデコーダーではなく、低速のCPUでソフトウェアデコーダーを対象とする場合に役立ちます。)メインはBフレームでデブロッキングなしまたはCABACは、デブロッキング付きのベースラインよりもよく見える場合とそうでない場合があります。+1は、h.264の保存にnot-AVIを推奨します。IIRC、メインはBフレームですが、ええ、aviのh.264は十分に標準化されておらず、ハックです。
Peter Cordes

-crf 20ハイファイナルと呼んでいます。スポーツイベントのように動きが激しい場合を除いて、これを22または24に変更してもかまいません。
user24601

2

明確にしておくべきことがいくつかあります。

  • フォーマットはコーデックではありませんh264コーデックでエンコードされたビデオを含むavi 形式のファイルを取得したい。-vcodec libx264.aviのファイル名を使用するだけです。Ffmpegはファイル拡張子を調べることで形式を認識しますが、-f aviを追加することもできます。mpeg1 を使用したくないと明確に定義します。mpeg2よりも品質が悪いためです。
  • あなたの問題は、何も指定しなかったために、ffmpegが可能な限り低い品質を使用したことでした。-sameqオプションは、私にはほとんど機能しないようです。実際、ビットレートを手動で設定することは非常に少数です。たとえば、-vb 3000kを追加して、平均ビデオビットレートが3Mb / sのファイルを取得します。これにより、非常に優れた品質が得られます。上記の解像度では2Mb / sで十分です。
  • ファイルサイズを小さくする鍵は解像度ではなく、上記のビットレートです。元の解像度に固執し、ビットレートを操作するだけです。
  • また、オーディオを変換せずに(つまり、品質を損なうことなく)維持したいと思うので、-acodec copyを使用します

これを試してください: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowerres.avi


4
一定のビットレートは、x264のすべてのレート制御モードの(品質とサイズの観点から)最悪であり、回避する必要があります。-crf代わりに、一定品質モードを設定するために使用します。
slhck 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.