Wie kann ich FFmpeg verwenden, um die Qualität von H264-Videos zu verringern, aber im H264-Format zu halten?


8

Ich bin ein absoluter Neuling in der Videobearbeitung, also vergib mir, wenn ich nach etwas Lächerlichem frage.

Ich bekomme Videoclips von einer Set-Top-Recorder-Box. Die Clips sind AVI-Dateien:

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

Die Auflösung und die FPS liegen weit über meinen Anforderungen, daher versuche ich, einen Befehl auszuführen, um die Dinge zu verkleinern:

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

Dies ist erfolgreich, um mir die gewünschte Auflösung, Framerate und geringere Dateigröße zu geben, aber es hat auch die Qualität mehr als erwartet verschlechtert.

Ich habe mir die neue Datei angesehen und festgestellt, dass FFmpeg aus irgendeinem Grund das verwendete Format konvertiert hat:

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

Mir ist unklar, warum nicht dieselben Ausgabeformate wie Eingabeformate verwendet werden. Ich habe versucht, diesen Befehl zu verwenden, um die Verwendung von H.264 zu erzwingen:

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

Leider ist es mit folgender Ausgabe fehlgeschlagen:

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

Ich bin mir nicht sicher, warum ich das nicht kann. Wenn Sie "ffmpeg-Formate" ausführen, wird h264 als eines aufgeführt, das sowohl für die Eingabe als auch für die Ausgabe verwendet werden kann.

Wenn mich jemand in die richtige Richtung weisen könnte, würde ich es sehr schätzen. Vielen Dank.

PS: Ich verwende FFmpeg Version 0.7.3-4: 0.7.3-0 unter Ubuntu 11.10.

BEARBEITEN

Ich habe eine Lösung für die Verwendung von Voreinstellungen gefunden. Nachdem ich nach Informationen zu Presets gesucht hatte, fand ich das folgende Tutorial, in dem sie besprochen wurden:

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

Ich musste nur den Codec und die richtige Voreinstellung wie folgt angeben:

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

Ich muss noch einige Anpassungen vornehmen, aber das ist im Grunde das, was ich wollte. Vielen Dank.


Sicher, einige Leute möchten einfach nur wissen, wie man Avermedia .avi-Dateien .mp4 konvertiert, damit sie auf Mountain Lion / Mavericks <pre> ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 </ pre>

Antworten:


3

Ich versuche zu helfen. Erstens verstehe ich nicht, warum Sie sagen, dass FFMPEG H.264 nicht das Eingabeformat ist?

Ich kenne die FFMPEG-Befehlszeile nicht gut genug (gibt es jemanden, der das tut ?;)). Es muss einen Schalter für die Multipass-Codierung geben. Ich weiß, dass es einige integrierte Voreinstellungen gibt, die Sie wahrscheinlich verwenden und mit ziemlicher Sicherheit das tun könnten, was Sie anstreben. Diese werden normalerweise als x264-Voreinstellungen oder x264-Melodie bezeichnet. Kannst du so etwas finden?


Vielen Dank. Ihr Vortrag über Voreinstellungen hat mir geholfen, eine wahrscheinliche Lösung zu finden. Ich werde den Beitrag bearbeiten, um zu zeigen, was ich getan habe.
BigBeagle

Schöne Lösung. Zu meiner Sammlung von Schnipsel hinzugefügt. Vielen Dank.
Zettt

2
@ BigBeagle: Wenn Sie eine Antwort auf Ihre Frage finden, können Sie diese als Antwort veröffentlichen. Die Bearbeitung Ihrer Frage erfolgt, um die Frage klarer zu gestalten. Soweit ich weiß, finden Sie die Antworten im Antwortbereich.
Nav

8

ffmpeg hat seine x264-Voreinstellungen entfernt, sodass die Einstellung -vpre nicht mehr funktioniert.

Jetzt habe ich ein Skript zum Konvertieren von Videodateien in ein Format, das mein Mobiltelefon verarbeiten kann.

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

Ich werde jede Option erklären

-sws_flags lanczos+accurate_rnd Diese Option ist der Downscaling-Algorithmus. Lanczos wird empfohlen, da er die geringsten Artefakte erzeugt, ohne zu verwischen, aber langsam ist.

-vf "scale=..." ist selbsterklärend, geben Sie die Ausgabeauflösung an

-crf 20Dies ist die Qualität. 20 ist eine gute endgültige Ausgabeeinstellung (nicht vor dem Bearbeiten verwenden). Dies ist eine konstante Qualität und die beste Option, wenn die Dateigröße nicht eng ist und bei der niedrigsten Dateigröße eine bessere Qualität als alles andere erzeugt -b 2000kWenn Sie andernfalls zwei Durchgänge verwenden, um maximale Qualität bei einer bestimmten Dateigröße zu erzielen (z. B. wenn Sie diese auf eine CD oder DVD einpassen müssen), sollte die feste Bitrate (z. B.) nur beim Streaming verwendet werden. Ein Sonderfall ist "0", was verlustfrei ist und Der Bereich dieser Option reicht von 1 (höchste Qualität) bis 50 (niedrigste Qualität).

Ein guter Test dafür ist, die Codierung mit -crf 20 zu durchlaufen, die Bitrate zu notieren und diese dann als -b-Einstellung für eine zweite Version der Datei zu verwenden. Beide sollten dieselbe Dateigröße haben. Vergleichen Sie die beiden hinsichtlich der Qualität Unterschiede.

-preset veryslow Hiermit wird festgelegt, wie viel CPU Sie verwenden möchten. Je langsamer diese ist, desto kleiner ist die Dateigröße und desto besser ist die Qualität.

-profile:v mainDies ist das zu verwendende H.264-Profil . Hoch ist die effizienteste Dateigröße, verwendet jedoch im Vergleich zu den anderen Formaten viel CPU zum Decodieren. Dies ist jedoch das beliebteste, da die meisten Mobiltelefone einen eingebauten Hardware-Decoder haben und der Flash Player ihn unterstützt. Meins muss ich nicht benutze main.

-tune fastdecode Mein Handy mag es nicht, Dateien ohne diese Option abzuspielen, aber normalerweise kann dies leer gelassen oder für Videospiele auf "Film" gesetzt werden. Der Hauptgrund, warum Sie dies verwenden, ist, ein wenig mehr Qualität zu erhalten.

Und als letztes würde ich die Verwendung eines modernen Containerformats wärmstens empfehlen .avi ist nicht für H.264 ausgelegt. Soweit ich weiß, gibt es keinen Standard für das Speichern von H.264 oder das Vergrößern der Datei auf mehr als 2 GB. Die meisten Implementierungen sind Hacks und anfällig um probleme zu haben, benutze mkv oder mp4.


Die Voreinstellungen für libx264 werden jetzt von -presetin-preset slow
stib

-tune fastdecodeDeaktiviert das Deblocking und gewichtete B- und P-Frames sowie CABAC. Es gibt Decoder, die B-Frames verarbeiten können, aber nicht CABAC? Ich würde vorschlagen -profile:v baseline, wenn Sie auf alte Hardware-Decoder abzielen müssen. ( fastdecodeKann nützlich sein, wenn ein Software-Decoder auf einer langsamen CPU, aber nicht auf einem Hardware-Decoder ausgerichtet ist.) Main mit B-Frames, aber ohne Deblocking oder CABAC sieht möglicherweise besser aus als die Baseline mit Deblocking. +1 für die Empfehlung von Nicht-AVI zum Speichern von h.264. IIRC, das Hauptbild sind B-Frames, aber ja, h.264 in avi ist nicht gut standardisiert und hackig.
Peter Cordes

Ich würde -crf 20ein hohes Finale nennen. Sie können das auf 22 oder sogar 24 ändern und wahrscheinlich in Ordnung sein, es sei denn, es ist eine hohe Bewegung, wie bei einem Sportereignis.
user24601

2

Es gibt einige Dinge zu verdeutlichen:

  • Ein Format ist kein Codec. Sie möchten eine Datei im AVI- Format mit Video erhalten, das mit dem h264- Codec codiert ist . Verwenden Sie einfach -vcodec libx264 und einen Dateinamen mit .avi . Ffmpeg sollte ein Format anhand einer Dateierweiterung erkennen, aber Sie können auch spezifisch -f avi hinzufügen . Sie möchten mpeg1 definitiv nicht verwenden, da es eine schlechtere Qualität als mpeg2 oder sogar eine schlechtere Qualität im Vergleich zu mpeg4 bietet, was ich empfehle.
  • Ihr Problem war, dass ffmpeg nur die niedrigstmögliche Qualität verwendet hat, weil Sie keine angegeben haben. Die Option -sameq scheint bei mir selten zu funktionieren. Tatsächlich ist es sehr schwierig, die Bitrate manuell einzustellen. In zum Beispiel -vb 3000k eine Datei mit durchschnittlich erhalten Video - Bitrate von 3 Mb / s, was gibt recht gute Qualität. Ich denke, es würde sogar ausreichen, wenn Sie 2 MBit / s für die erwähnte Auflösung haben.
  • Der Schlüssel zum Verringern der Dateigröße ist nicht die Auflösung, sondern die oben erwähnte Bitrate. Ich würde mich lieber an die ursprüngliche Auflösung halten und nur die Bitrate manipulieren.
  • Ich denke, Sie möchten das Audio auch ohne Konvertierung behalten (also ohne Qualitätsverlust), also verwenden Sie -acodec copy .

Versuchen Sie Folgendes : ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowerres.avi


4
Die konstante Bitrate ist die schlechteste (in Bezug auf Qualität und Größe) aller Ratensteuerungsmodi in x264 und sollte vermieden werden. Verwenden Sie -crfstattdessen einen konstanten Qualitätsmodus.
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.