%20in%20MP4%20(H.264)%20unter%20Beibehaltung%20der%20Qualit%C3%A4t.png)
Ich möchte eine AVI-Datei mit einem h.264-Codec in MP4 komprimieren. Ich konnte nicht die gleiche Qualität erzielen. Wie kann ich sie 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
Prüfung 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
Prüfung 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
Antwort1
Installieren Sie zunächst eine aktuellere Version von FFmpeg – holen Sie sich einen statischen Build vondie Download-Seite.
Die Verwendung von vpre
Voreinstellungen (das ist eine Möglichkeit, Standardwerte festzulegen fürffmpegEinstellungen, nicht Encodereinstellungen) ist nicht wirklich notwendig; normalerweise möchten Sie die -preset
von den Encodern definierten Optionen verwenden.
Die Gründe für die schlechte Ausgabequalität sind in Ihren beiden Fällen die folgenden:
Im ersten Fall verwenden Sie
crf 25
, einKonstanter Ratenfaktordas ergibt eine schlechtere Qualität als der Standardwert für den x264-Encoder (23). Der CRF steuert die Qualität. Versuchen Sie, einen niedrigeren CRF einzustellen, vielleicht 20, 18 usw. Hier bedeutet niedriger eine bessere Qualität, aber die Dateigröße wird größer. Eine Änderung von 6 im CRF ergibt grob gesagt die doppelte/halbe ursprüngliche durchschnittliche Bitrate.Sie müssen einen niedrigeren CRF festlegen, daGenerationsverlust. Sie kodieren etwas, das bereits kodiert war, und werfen damit erneut visuelle Informationen weg. Das ist nie gut, aber wenn es sein muss, müssen Sie eine höhere Qualität einstellen, um nicht zu viele Informationen aus dem Eingabevideo zu entfernen.
Im zweiten Fall versuchen Sie, eine konstante Bitrate von 2 MBit/s einzustellen. Ihr Eingangsvideo hat ungefähr dieselbe Bitrate. Nun liefert x264 bei derselben Bitrate eine viel bessere Bildqualität als ein MPEG-4 Visual-Encoder, aber aufgrund des Generierungsverlusts möchten Sie möglicherweise eine noch höhere Bitrate als das Original verwenden – andernfalls gehen am Ende zu viele Informationen verloren.
Darüber hinaus kann die Kodierung mit konstanter Bitrate dazu führen, dass einige Passagen gut aussehen, andere Teile des Videos jedoch schlechter. Wenn Sie dem Encoder nicht die freie Wahl lassen, wie viele Bits er für etwas ausgeben möchte, müssen Sie auf Kosten der Zieldateigröße Qualität opfern.
x264 verfügt zwar über einen Modus mit konstanter Bitrate, dieser gilt jedoch als den anderen Kodierungsmethoden unterlegen. Tatsächlich zielt die Zwei-Pass-Kodierung nicht auf optimale Qualität ab, also vergessen Sie das.
Versuchen Sie dennoch etwas in der Art des Folgenden:
ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4
Wenn libfdk_aac
es nicht verfügbar ist, 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 wichtigste Qualitätskontrollknopf 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 Voreinstellung wählen veryslow
, die eine bessere Komprimierung bietet, die Kodierung dauert dann aber offensichtlich länger.
Wenn Sie es nicht schaffen, eine Datei mit angemessener Qualität und angemessener Dateigröße zu erhalten, haben Sie Pech gehabt. Behalten Sie die Originaldatei besser so, wie sie ist, ohne sie neu zu kodieren. Es gibt kein magisches Tool, mit dem Sie die Qualität beibehalten können, wenn Sie etwas komprimieren, das bereits komprimiert ist.