Wie erstelle ich mit FFMPEG eine MPEG2-Videodatei mit der höchstmöglichen Qualität?

16

Ich habe eine WMV-Datei (Version 9 (WMV3), 960 x 720, 30.000030 fps, planares 4: 2: 0 YUV, erstellt von PowerPoint 2010) und muss sie in MPEG2 konvertieren - das einzige Format, das mein Fernseher von einem USB-Flash-Laufwerk lesen kann (Ich habe auch versucht, MP4 / h.264, AVI / XVID - nichts als MPEG2 funktioniert).

Ich habe es geschafft, den Job mit einfach zu machen

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

Die Qualität des Ergebnisses ist jedoch furchtbar (es treten deutlich sichtbare visuelle Verzerrungen auf) und die Wiedergabe ist nicht flüssig (manchmal zu langsam).

Ich habe es auch versucht

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Ich habe dies irgendwo im Internet gefunden und ein wenig modifiziert - die Auflösung, die Bildwiederholfrequenz und das Ausgabeformat (von VOB auf nacktes MPG) wurden erfolgreich geändert, aber die Qualität ist immer noch zu schlecht.

Welche Parameter muss ich verwenden, um so viel Qualität wie möglich zu sparen? Die Komprimierungsrate spielt keine Rolle, auch eine Vergrößerung der Datei ist akzeptabel.

Eine andere Sache, die ich wirklich brauche (ich habe mich entschieden, sie nicht in den Fragentitel aufzunehmen, um zu vermeiden, dass sie zu spezifisch wird, aber ich würde es begrüßen, wenn sie in den Antworten berücksichtigt wird), ist das Hinzufügen von purer Stille als Tonspur - es ist kein Ton in der Original aber der Fernseher beschwert sich darüber und ich möchte diese Beschwerde loswerden. Ich habe mit Audacity eine OGG Vorbis-Datei mit derselben Länge (sekundengenau) erstellt, kann sie jedoch nicht mit dem Video zusammenführen:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

und sogar nackt

ffmpeg -i in.mpg -c:v copy -out.mpg

gibt "Buffer Underflow" und "Packet too Large" Fehler. (in.mpg sind die Dateien, die von derselben FFMPEG-Binärdatei und derselben WMV-Quelldatei mit den ersten beiden Befehlen in der Frage erstellt wurden).

Ich verwende ein Zeranoe FFMPEG-Build unter Windows 7.

Ivan
quelle
2
Jemand wird Sie nach einem vollständigen Ausgabeprotokoll fragen.
Dienstag,
Welcher Fernseher genau? Es könnte in der Lage sein, H.264 zu lesen, nur ein anderes Profil.
Slhck
@slhck Das Fernsehgerät ist Philips 42PFL3606H/58, ich codiere auf H.264 mit ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- das Profil ist das niedrigste, das ich kenne, und es werden noch mehr Optimierungen verwendet, um das Abspielen der resultierenden Datei zu einer einfacheren Aufgabe zu machen.
Ivan
1
Laut Handbuch unterstützt der Fernseher MPEG-4 Visual und H.264. Wenn das Baseline-Profil nicht funktioniert, bin ich mir nicht sicher, was es tut. Aber Fernseher sind sehr wählerisch.
Slhck

Antworten:

16

Das Problem ist, dass die Standard-Bitrate für MPEG-2 eher niedrig ist (wie bei den meisten anderen Video-Encodern in ffmpeg, wobei H.264 eine Ausnahme darstellt). MPEG-2 ist heutzutage auch nicht die beste Wahl als Codec.

Bessere Qualität für MPEG-2

Sie haben ein paar Optionen, wenn Sie sich an MPEG-2 halten möchten:

  • Erhöhen Sie die Bitrate. Du benutzt jetzt -b:v 2500k. Wenn es sich um HD-Video handelt, kommen Sie mit nur 2,5 MBit / s nicht weit. Sie brauchen mindestens das Doppelte oder noch mehr, damit das Ergebnis gut aussieht. Verwenden Sie zum Beispiel -b:v 6000k -target pal-dvd.

    Für 720p denke ich, dass du trotzdem eine höhere Bitrate verwenden solltest. Denken Sie daran, dass DVDs MPEG-2 verwenden und etwa 4,7 GB für 2 Stunden Film benötigen, sodass Sie am Ende etwa 5 bis 8 MBit / s erreichen. MPEG-2 ist wirklich nicht sehr komprimierungseffizient und arbeitet bei höheren Bitraten besser.

  • Verwenden Sie eine bestimmte Qualitätseinstellung. Wechseln Sie -b:v …zu -qscale:v 2. Die Zahl reicht hier von 1 bis 31 und höher bedeutet geringere Qualität. Es gibt keinen Grund, über 4 oder 5 hinauszugehen. Wenn Sie sich nicht für die Bitrate interessieren, beginnen Sie mit 2 und prüfen Sie, ob dies für Sie funktioniert.

Wenn Sie mit der Anzahl der B-Frames, der Bewegungsschätzungsmethode oder der GOP-Größe spielen, kann dies die Qualität etwas verbessern, führt jedoch nicht zu großen Änderungen.

Stummer Ton

Verwenden Sie -f lavfi -i aevalsrc=0diese Option , um einen stummen Audiostream zu generieren. Beispielsweise:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Möglicherweise müssen Sie -target pal-dvdden obigen Befehl ergänzen , um eine bestimmte Puffergröße zu erzwingen.

Ich habe MP3 als Codec gewählt. MPEG-Dateien können kein anderes Audio als MPEG Layer I- und II-Audio sowie PCM-Streams enthalten. Daher funktioniert die Verwendung einer stillen Ogg Vorbis-Datei nur, wenn Sie auch den Audio-Stream konvertieren (was bei Verwendung nicht der Fall ist -c:a copy). .

Verwenden Sie einen anderen Video-Codec

Ich bin überrascht, dass ein Fernseher, der Videodateien wiedergibt, MPEG-2 liest, aber sonst nichts. Es sollte mindestens MPEG-4 Part II Video unterstützt werden (das ist, was Sie als "DivX" - ein MPEG-4 Part II Encoder - kennen). Sie könnten also versuchen:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

Ihr Fernseher unterstützt möglicherweise auch H.264, jedoch nur ein bestimmtes Profil. Versuchen Sie es mit dem baselineProfil, zum Beispiel:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

Im obigen Beispiel habe ich die CRF-Option verwendet, um die Qualität festzulegen, anstatt qscale. Weitere Informationen finden Sie im Handbuch zur H.264-Codierung .

slhck
quelle
"Durcheinander mit der Anzahl der B-Frames, der Bewegungsschätzungsmethode oder der GOP-Größe kann die Qualität ein wenig verbessern, führt aber nicht zu großen Änderungen." - Darf ich einfach jedes Bild zu einem B-Bild machen und keine Bewegungsschätzung mit MPEG2 verwenden? Das Video hat viele SEHR dynamische Teile.
Ivan
Ich habe die erste von Ihnen vorgeschlagene Befehlszeile ausprobiert ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - sie codiert ungefähr 100 Frames und fängt dann an, den Bildschirm mit Fehlern wie [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761und zu überfluten [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan
@Ivan Mit änderst du die Bitrate -b:v. Fügte es meiner Antwort hinzu. Zu den Encoder-Einstellungen: Sie können nicht jeden Frame zu einem B-Frame machen. Außerdem benötigen Sie eine Bewegungsschätzung - je vollständiger die Methode ist, desto besser ist die Komprimierung. Wenn es sich jedoch um ein dynamisches Video handelt, sollten Sie zunächst die Bitrate deutlich erhöhen. Die Kodierungseinstellungen haben wirklich keine großen Auswirkungen. Sind Sie sicher, dass dies der Fehler für den richtigen Befehl ist? Ein [mpeg]Fehler kann nur auftreten, wenn Ihre Ausgabedatei vorhanden ist .mpg, nicht, wenn dies der Fall ist .mp4.
Slhck
Ich habe kopiert = einen falschen Teil eingefügt, @slhck, ich benutze ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"natürlich.
Ivan
1
-target pal-dvdlöst das Problem, -bufsizefunktioniert nicht (ich habe es versucht -b:v 7M -bufsize 7M -maxrate 7M).
Ivan
0

Ich würde sofort sagen, wenn die Dateigröße keine Rolle spielt, experimentiere einfach mit der Erhöhung der Bitrate.

Für das stille Audio möchten Sie vielleicht nur ffmpeg verwenden. Ich weiß nicht genug über Audacity, um irgendeine Art von Kommentar abzugeben. Ich habe das schon mal benutzt.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Dies funktioniert jedoch nicht für Sie, da Sie den mpg-Container verwenden, und Sie können es versuchen. (Mp3-Container)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Es schien für mich zu funktionieren.

dstob
quelle
Das Festlegen der Dauer ist nicht erforderlich, da ffmpeg nur die für das Video erforderlichen Elemente verwendet.
Slhck
Ich habe die Dinge im zweistufigen Prozess belassen, wie Ivan es getan hatte. Wenn Sie die Dauer in meinem Befehl weglassen, weiß ich nicht, wie lange ffmpeg ausgeführt werden würde (wahrscheinlich länger als Sie möchten).
Dienstag,