Konvertieren Sie AVI (Xvid) in MP4 (H.264) bei gleicher Qualität


47

Ich möchte eine AVI-Datei mit einem h.264-Codec in MP4 komprimieren. Ich konnte nicht die gleiche Qualität bekommen. Wie kann ich es komprimieren?

Originalvideo:

Original-Videobildschirm:

FFmpeg-Konsolenausgabe ( 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

Test 1

FFmpeg Befehl:

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

Test 1 Bildschirm:

FFmpeg-Konsolenausgabe ( 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

Test 2

FFmpeg Befehl:

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

Test 2 Bildschirm:

FFmpeg-Konsolenausgabe ( 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

Antworten:


60

Installieren Sie zunächst eine neuere Version von FFmpeg - holen Sie sich einen statischen Build von der Download-Seite .

Die Verwendung von vpreVoreinstellungen (mit denen Standardwerte für ffmpeg- Einstellungen und nicht für Encoder-Einstellungen festgelegt werden können) ist nicht unbedingt erforderlich. Normalerweise möchten Sie -presetdie von den Encodern definierten Optionen verwenden.

Die Gründe für die schlechte Ausgabequalität sind in beiden Fällen die folgenden:

  1. Im ersten Fall verwenden Sie crf 25einen konstanten Ratenfaktor , der eine schlechtere Qualität als der Standardwert für den x264-Encoder (23) liefert. Das CRF kontrolliert die Qualität. Versuchen Sie, einen niedrigeren CRF-Wert einzustellen, z. B. 20, 18 usw. Hier bedeutet niedriger eine bessere Qualität, erhöht jedoch die Dateigröße. Eine Änderung des CRF um 6 ergibt ungefähr die Hälfte der ursprünglichen durchschnittlichen Bitrate.

    Sie müssen wegen des Generationsverlusts eine niedrigere CRF einstellen . Sie codieren etwas, das bereits codiert wurde, sodass Sie wieder visuelle Informationen wegwerfen. Das ist nie gut, aber wenn Sie müssen, müssen Sie eine höhere Qualität einstellen, um nicht zu viele Informationen aus dem Eingangsvideo zu entfernen.

  2. Im zweiten Fall versuchen Sie, eine konstante Bitrate von 2 MBit / s einzustellen. Ihr Eingangsvideo hat ungefähr die gleiche Bitrate. Jetzt liefert x264 eine viel bessere visuelle Qualität als ein visueller MPEG-4-Encoder für die gleiche Bitrate. Aufgrund des Generationsverlusts möchten Sie jedoch möglicherweise eine noch höhere Bitrate als das Original verwenden - andernfalls wird die Komprimierung beendet zu viel Information.

    Darüber hinaus kann eine konstante Bitratencodierung dazu führen, dass einige Passagen gut aussehen, andere Teile des Videos jedoch schlechter. Wenn Sie nicht zulassen, dass der Encoder die Anzahl der Bits, die er für etwas ausgeben möchte, frei wählt, wird die Qualität auf Kosten der Kenntnis der Zieldateigröße beeinträchtigt.

    x264 verfügt zwar über einen Modus mit konstanter Bitrate, er wird jedoch als den anderen Codierungsmethoden unterlegen angesehen. Tatsächlich soll die Codierung in zwei Durchläufen keine optimale Qualität erzielen.

Nachdem dies alles gesagt ist, probieren Sie Folgendes aus:

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

Wenn libfdk_aacnicht verfügbar, verwenden Sie stattdessen Folgendes:

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

Der Hauptknopf für die Qualitätskontrolle ist Ihre CRF-Einstellung. Experimentieren Sie damit und verwenden Sie einen niedrigeren Wert, wenn Sie eine bessere Qualität benötigen.

Sie können auch die veryslowVoreinstellung auswählen , um eine bessere Komprimierung zu erzielen, aber die Codierung dauert offensichtlich länger.

Wenn Sie nicht in der Lage sind, eine Datei mit anständiger Qualität und angemessener Dateigröße zu erhalten, haben Sie Pech. Behalten Sie die ursprüngliche Datei so bei, wie sie ist, ohne sie neu zu codieren. Es gibt kein magisches Werkzeug, das die gleiche Qualität beibehält, wenn Sie etwas komprimieren, das bereits komprimiert ist.


Wenn Ihr Video nach der Konvertierung mit zwei Durchgängen kleiner ist, müssen Sie eine höhere Bitrate angeben. Versuchen Sie -b:v 3Moder mehr; Ich würde jedoch empfehlen, die CRF-Methode anstelle der Variante mit zwei Durchgängen zu verwenden.
Slhck

10
@AhmetKa Eine weitere Möglichkeit ist, einfach wieder Mux die Ströme von AVI - Container zu MP4 - Container: ffmpeg -i input.avi -c copy -map 0 output.mp4. Es erfolgt keine Neucodierung, sodass keine Qualitätsverluste auftreten.
Logan

1
@AhmetKa Ich hätte erwähnen sollen, dass Muxen nicht immer funktioniert, wenn das Ausgabe-Container-Format keine Medienformate der Eingabe unterstützt. Unter Vergleich der Containerformate erhalten Sie einen allgemeinen Überblick über die Funktionsweise.
Logan

Hallo nochmal @slhck Crf geht nicht richtig. Bitrate, Breite, Höhe usw. Kann ich rechnen?
Ahmet KAPIKIRAN

3
@hyde Sie sollten lieber -c:a aac -strict experimentalstatt libvo_aacenc, weil es eine bessere Qualität liefert.
Slhck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.