Ich bin ein absoluter Neuling in der Videobearbeitung. Verzeihen Sie mir, wenn ich nach etwas Lächerlichem frage.
Ich erhalte Videoclips aus 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 zum Verkleinern auszuführen:
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 weit 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
Es ist mir unklar, warum 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 dies fehlgeschlagen mit der folgenden Ausgabe:
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 dies nicht tun kann. Wenn ich „ffmpeg-Formate“ ausführe, wird h264 als eines aufgeführt, das es verwenden könnte für Eingabe und Ausgabe.
Wenn mich jemand in die richtige Richtung weisen könnte, würde ich es sehr schätzen. Danke.
PS: Ich verwende FFmpeg Version 0.7.3-4: 0.7.3-0 unter Ubuntu 11.10.
BEARBEITEN
Ich habe fand eine Lösung für die Verwendung von Voreinstellungen. Nachdem ich nach Informationen zu Voreinstellungen gesucht hatte, fand ich das folgende Tutorial, in dem sie erläutert 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.
Kommentare
- 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 >
Antwort
I “ 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 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önnen, was Sie anstreben. Diese werden normalerweise als x264-Voreinstellungen oder x264-Melodie bezeichnet. Können Sie so etwas finden?
Kommentare
- Danke. 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.
- Gute Lösung. Zu meiner Sammlung von Schnipsel hinzugefügt. Danke.
- @BigBeagle: Wenn Sie eine Antwort auf Ihre Frage finden, können Sie diese als Antwort veröffentlichen. Das Bearbeiten Ihrer Frage erfolgt, um die Frage klarer zu gestalten. Soweit ich weiß, finden Sie die Antworten im Antwortbereich.
Antwort
ffmpeg hat ihre x264-Voreinstellungen entfernt Die Einstellung -vpre funktioniert nicht mehr.
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 sie die geringsten Artefakte erzeugt, ohne zu verwischen langsam.
-vf "scale=..."
ist selbsterklärend. Geben Sie die Ausgabeauflösung an.
-crf 20
Dies 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 eine bessere Qualität bei niedrigster Dateigröße als alles andere erzeugt. Andernfalls wird sie verwendet Zwei Durchgänge für maximale Qualität bei einer bestimmten Dateigröße (z. B. auf eine CD oder DVD), feste Bitrate (z. B. ) sollte nur beim Streaming verwendet werden. Ein Sonderfall ist“ 0 „, der 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 für Qualitätsunterschiede.
-preset veryslow
Hiermit wird festgelegt, wie viel CPU Sie verwenden möchten, je langsamer Je kleiner die Dateigröße und desto besser die Qualität.
-profile:v main
Dies ist das H.264-Profil zu verwenden. 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 und nach meinem Verständnis dort. s kein Standard zum Speichern von H.264 oder zum Vergrößern der Datei auf mehr als 2 GB. Die meisten Implementierungen sind Hacks und neigen zu Problemen. Verwenden Sie mkv oder mp4.
Kommentare
- Die Voreinstellungen für libx264 werden jetzt durch
-preset
wie in-preset slow
- deaktiviert 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
-profile:v baseline
vorschlagen , wenn Sie auf alte Hardware-Decoder abzielen müssen. (fastdecode
kann nützlich sein, wenn Sie auf eine Software abzielen Re-Decoder auf einer langsamen CPU, aber kein Hardware-Decoder.) 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 ‚ ist hacky. - I ‚ d call
-crf 20
ein hohes Finale. Sie können dies auf 22 oder sogar 24 ändern und es ist wahrscheinlich in Ordnung, es sei denn, ‚ ist eine hohe Bewegung, wie bei einem Sportereignis.
Antwort
Es gibt einige Dinge zu verdeutlichen:
- Ein Format ist kein ein Codec; Sie möchten eine Datei im Format avi mit Video erhalten, das mit h264 codiert ist Codec. 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 definitiv nicht mpeg1 verwenden, da es eine schlechtere Qualität als mpeg2 oder sogar eine schlechtere 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. Fügen Sie zum Beispiel -vb 3000k hinzu, um eine Datei mit einer durchschnittlichen Video -Bitrate von 3 MBit / s zu erhalten, was eine recht gute Qualität ergibt. Ich denke, es würde sogar für Sie ausreichen 2 MBit / s für die erwähnte Auflösung.
- 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 (also ohne Qualitätsverlust) behalten, verwenden Sie also -acodec copy .
Versuchen Sie Folgendes: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k niedriger res.avi
Kommentare
- Die konstante Bitrate ist die schlechteste (in Bezug auf Qualität und Größe) aller Ratensteuerungsmodi in x264 und sollte vermieden werden. Verwenden Sie
-crf
, um stattdessen einen konstanten Qualitätsmodus festzulegen.