AVI(Xvid)をMP4(H.264)に変換して同じ品質を維持


47

h.264コーデックを使用してAVIファイルをMP4に圧縮したい。私は同じ品質を得ることができませんでした。どうすれば圧縮できますか?

元のビデオ:

元のビデオ画面:

FFmpegコンソール出力(ffmpeg -i input.avi):

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

テスト1

FFmpegコマンド:

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

テスト1画面:

FFmpegコンソール出力(ffmpeg -i 1.mp4

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

テスト2

FFmpegコマンド:

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

テスト2画面:

FFmpegコンソール出力(ffmpeg -i 2.mp4

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

回答:


60

まず、FFmpegの最新バージョンをインストールしますダウンロードページから静的ビルドを取得します

使用vpre(の設定のデフォルト値への道であるプリセットffmpegの設定ではなく、エンコーダの設定は)本当に必要はありません。通常-preset、エンコーダーによって定義されたオプションを使用します。

2つのケースそれぞれについて、出力品質が低下する理由は次のとおりです。

  1. 最初のケースでは、x264エンコーダーのデフォルト(23)よりも品質が低下crf 25する定数レートファクターを使用します。CRFは品質を制御します。20、18などの低いCRFを設定してみてください。ここでは、低いほど品質が高くなりますが、ファイルサイズが大きくなります。CRFを6に変更すると、おおまかに言って、元の平均ビットレートの2倍/半分が得られます。

    世代の損失のため、CRFを低く設定する必要があります。すでにエンコードされているものをエンコードしているため、再び視覚情報を捨てています。それは決して良いことではありませんが、必要な場合は、入力ビデオから多くの情報を削除しないように、より高い品質を設定する必要があります。

  2. 2番目のケースでは、2 MBit / sの固定ビットレートを設定しようとしています。入力ビデオのビットレートはほぼ同じです。現在、x264は同じビットレートのMPEG-4ビジュアルエンコーダよりもはるかに優れた視覚品質を提供しますが、世代の損失のために、元のビットレートよりもさらに高いビットレートを使用したい場合があります。多すぎる情報。

    さらに、一定のビットレートエンコーディングでは、一部のパッセージは見栄えがよくなりますが、ビデオの他の部分は見た目が悪くなります。エンコーダーが何かに費やすビット数を自由に選択できないようにすると、ターゲットファイルのサイズを知ることを犠牲にして品質を犠牲にすることになります。

    x264には固定ビットレートモードがありますが、他のエンコード方式よりも劣ると考えられています。実際、2パスエンコーディングは最適な品質をターゲットにすることを意図したものではないので、それをスクラッチします。

すべてのことを言っているので、次のことを試してください。

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

場合はlibfdk_aac利用できない、これを代わりに使用します。

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

主な品質管理ノブは、CRF設定になります。それを試して、より良い品質が必要な場合は低い値を使用してください。

veryslowプリセットを選択することもできます。これにより圧縮率が向上しますが、エンコードには明らかに時間がかかります。

適切なファイルサイズで適切な品質のファイルを取得できない場合は、運が悪いです。再エンコードせずに、元のファイルをそのまま保持することをお勧めします。すでに圧縮されているものを圧縮する場合、魔法の「同じ品質を維持する」ツールはありません。


2パスで変換した後、ビデオのサイズが小さい場合は、より高いビットレートを指定する必要があります。試してみてください-b:v 3M。しかし、2パスバリアントの代わりにCRFメソッドを使用することをお勧めします。
slhck

10
@AhmetKa別のオプションは、AVIコンテナからMP4コンテナへのストリームを単純に再多重化することですffmpeg -i input.avi -c copy -map 0 output.mp4。再エンコードは行われないため、品質の低下はありません。
llogan

1
@AhmetKa出力コンテナ形式が入力のメディア形式をサポートしていない場合、多重化は常に機能するとは限らないことを述べたはずです。何が機能するかの一般的なアイデアを得るには、コンテナ形式の比較を参照してください。
llogan

こんにちは、@ slhck Crfは正しくありません。ビットレート、幅、高さなど。計算できますか?
アフメットカピキラン

3
@hyde より良い品質を提供するため、の-c:a aac -strict experimental代わりにを選択する必要がありlibvo_aacencます。
slhck 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.