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

53385
Ivan

Ich habe eine WMV (v9 (WMV3), 960x720, 30.000030 fps, planare 4: 2: 0 YUV-Datei, die von PowerPoint 2010 erstellt wurde) und muss sie in MPEG2 konvertieren - das einzige Format, das mein TV-Gerät von einem USB-Flash-Laufwerk lesen kann (Ich habe auch MP4 / h.264, AVI / XVID ausprobiert - nichts außer MPEG2 funktioniert).

Ich habe es geschafft, den Job mit einfach zu erledigen

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

Die Qualität des Ergebnisses ist jedoch schrecklich (deutlich sichtbare visuelle Verzerrungen werden eingeführt) und die Wiedergabe ist nicht glatt (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 etwas modifiziert - die Resoultion, die Bildwiederholfrequenz und das Ausgabeformat (von VOB zu nacktem MPG) 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? Das Kompressionsverhältnis spielt keine Rolle, sogar eine Vergrößerung der Dateigröße ist akzeptabel.

Eine andere Sache, die ich wirklich brauche (ich habe mich entschieden, sie nicht in den Fragetitel aufzunehmen, um sie nicht zu spezifisch zu machen, aber ich würde es zu schätzen wissen, wenn sie in die Antworten einbezogen wird). Sie fügt reine Stille als Tonspur hinzu - es gibt keinen Ton im Soundtrack Original, aber der Fernseher beschwert sich darüber und ich möchte diese Beschwerde loswerden. Ich habe mit Audacity eine OGG-Vorbis-Datei mit der gleichen Länge (zweite Genauigkeit) erzeugt, aber ich schaffe es nicht, sie mit dem Video zusammenzufü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 

Fehler "Pufferunterlauf" und "Paket zu groß". (In.mpg sind die Dateien, die von der gleichen FFMPEG-Binärdatei und der gleichen WMV-Quelldatei mit den ersten beiden Befehlen in der Frage erzeugt wurden).

Ich verwende einen Zeranoe FFMPEG-Build unter Windows 7.

12
Jemand wird Sie um ein vollständiges Ausgabeprotokoll bitten. dstob vor 9 Jahren 1
Welcher Fernseher genau? Möglicherweise kann es H.264 lesen, nur ein anderes Profil. slhck vor 9 Jahren 0
@slhck Der Fernseher ist `Philips 42PFL3606H / 58`, ich kodiere zu H.264 mit 'ffmpeg -i" in.wmv "-sws_flags lanczos + exact_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 noch mehr Änderungen werden verwendet, um die resultierende Datei zu einer Wiedergabe zu machen einfachere Aufgabe. Ivan vor 9 Jahren 0
Laut Handbuch unterstützt das Fernsehgerät 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 vor 9 Jahren 1

2 Antworten auf die Frage

11
slhck

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

Bessere Qualität für MPEG-2

Sie haben einige Möglichkeiten, wenn Sie mit MPEG-2 bleiben wollen:

  • Erhöhen Sie die Bitrate. Sie verwenden jetzt -b:v 2500k. Wenn es sich um HD-Videos handelt, werden Sie mit 2,5 MBit / s nicht weit kommen. Sie benötigen mindestens das Doppelte oder sogar mehr, damit das Ergebnis gut aussieht. Verwenden Sie beispielsweise -b:v 6000k -target pal-dvd.

    Für 720p denke ich, dass Sie noch eine höhere Bitrate verwenden sollten. Denken Sie daran, dass DVDs MPEG-2 verwenden und für 2 Stunden Film ca. 4,7 GB groß sind, sodass Sie mit ca. 5–8 MBit / s rechnen müssen. MPEG-2 ist nicht sehr komprimierungswirksam und funktioniert 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 Sinn, der über 4 oder 5 hinausgeht. Wenn Sie sich nicht für die Bitrate interessieren, beginnen Sie mit 2 und sehen Sie, ob dies für Sie funktioniert.

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

Geräuschloses Audio

Verwenden Sie -f lavfi -i aevalsrc=0diese Option, um einen stillen Audiostrom zu generieren. Zum Beispiel:

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

Sie müssen möglicherweise -target pal-dvdden obigen Befehl hinzufügen, 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 sowie PCM-Streams enthalten. Die Verwendung einer unbeaufsichtigten Ogg Vorbis-Datei funktioniert daher nur, wenn Sie auch den Audiostream konvertieren (was Sie bei der Verwendung nicht tun -c:a copy). .

Verwenden Sie einen anderen Videocodec

Ich bin überrascht, dass ein Fernseher, der Videodateien abspielt, MPEG-2 liest, aber sonst nichts. Mindestens MPEG-4 Part II-Videos sollten unterstützt werden (das ist, was Sie als "DivX" - einen 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:

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 anstelle von einzustellen qscale. Weitere Informationen finden Sie in der H.264-Kodierungsanleitung .

"Mit der Anzahl der B-Frames, der Bewegungsschätzungsmethode oder der GOP-Größe kann sich die Qualität etwas verbessern, es werden jedoch keine großen Änderungen vorgenommen." - kann ich einfach jedes Bild zu einem B-Bild machen und mit MPEG2 keine Bewegungsschätzung verwenden? Das Video hat viele sehr dynamische Teile. Ivan vor 9 Jahren 0
Ich habe die erste Befehlszeile ausprobiert, die Sie vorschlagen (ffmpeg -i "in.wmv" -f lavfi -i aevalsrc = 0 -shortest -c: v libxvid -qscale: v 2 -c: ein libmp3lame "out.mp4" ` ) - es codiert etwa 100 Frames und beginnt, den Bildschirm mit Fehlern zu überfluten, wie zum Beispiel [[mpeg @ 02f69ba0] Pufferunterlauf i = 0 bufi = 235538 ​​size = 239761] und `[mpeg @ 02f69ba0] Paket zu groß, Puffergrenzen für Mux werden ignoriert es` Ivan vor 9 Jahren 0
@Ivan Sie ändern die Bitrate mit '-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 umfassender die Methode, desto besser die Kompression. Wenn es sich um ein dynamisches Video handelt, sollten Sie als erstes die Bitrate deutlich erhöhen. Die Kodierungseinstellungen * haben * wirklich keine Auswirkung. Bist du sicher, dass es sich bei dem Fehler um den richtigen Befehl handelt? Ein [mpeg] `- Fehler kann nur auftreten, wenn Ihre Ausgabedatei` .mpg` ist, nicht wenn `.mp4`. slhck vor 9 Jahren 0
Ich habe copy = einen falschen Teil eingefügt, @slhck, ich verwende `ffmpeg -i" in.wmv "-f lavfi -i aevalsrc = 0 -shortest -c: v mpeg2video -qscale: v 2 -c: ein libmp3lame" out.mpg "` natürlich. Ivan vor 9 Jahren 0
@Ivan Ich konnte das nicht reproduzieren, aber versuche, -target pal-dvd zu setzen, um eine Puffergröße zu erzwingen, oder benutze -bufsize 5M -maxrate 5M` (oder was auch immer deine Bitrate ist). slhck vor 9 Jahren 0
"-target pal-dvd" löst das Problem, "-bufsize" funktioniert nicht (ich habe "-b: v 7M -bufsize 7M -maxrate 7M" versucht). Ivan vor 9 Jahren 1
@Ivan Froh, dass es funktioniert hat. Vielen Dank für Ihre Rückmeldung. slhck vor 9 Jahren 0
Ich kann das Problem als gelöst betrachten, obwohl die Wiedergabe in den dynamischsten Momenten bei der Verwendung des Fernsehgeräts sichtbar langsamer ist und etwas besser ist, wenn Sie einen an HDMI angeschlossenen DVD- und USB-Player verwenden (und perfekt auf dem PC). Ich werde versuchen, die Auflösung zu verringern, um schneller zu werden. Vielen Dank für eine großartige ausführliche Antwort. Ivan vor 9 Jahren 0
Ich habe es übrigens auch geschafft, h.264 zu spielen - es war nur etwas Geduld nötig, es wurde langsamer geladen. Ich habe jetzt ein identisches Bild in WMV (nur PC), h.264 und MPEG2. Ivan vor 9 Jahren 0
Auf jeden Fall verlustfreie Videos in MPEG2 erstellen? Royi vor 7 Jahren 0
@Royi Kurzes Prüfen, scheint mit ffmpeg nicht möglich zu sein. Sie können "qscale" nur auf 1 setzen, was immer noch verlustbehaftet ist. Gibt es einen Grund, warum dies Ihr Anwendungsfall ist, statt z. B. verlustfreies HuffYUV oder andere gängige Codecs zu verwenden? slhck vor 7 Jahren 0
Ich habe eigentlich nur Probleme mit FFMPEG unter Windows. Ich habe ein "qtrle" -Video im MOV-Container (Erstellt unter OS X). Ich habe `ffmpeg -i DL126H.mov -c copyclip0002.mp4` ausprobiert. Ich bekomme` Konnte Tag für Codec qtrle in Stream # 0 nicht finden, Codec wird derzeit nicht in Container unterstützt `. Royi vor 7 Jahren 0
@Royi Stellen Sie eine neue Frage und fügen Sie die vollständige, ungeschnittene Befehlszeilenausgabe ein. Fügen Sie im Idealfall auch ein Beispielvideo hinzu. slhck vor 7 Jahren 0
@slhck, ich habe - https://superuser.com/questions/1188546/convert-mov-video-file-encoded-as-qtrle-in-windows- using-ffmpeg. Danke dir. Royi vor 7 Jahren 0
0
dstob

Ich würde sofort sagen, wenn die Dateigröße nicht wirklich wichtig ist, experimentieren Sie einfach mit der Erhöhung der Bitrate.

Für das Silent-Audio möchten Sie vielleicht nur ffmpeg verwenden. Ich weiß nicht genug über Audacity, um irgendeinen Kommentar zu geben. Ich habe das schon früher 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. Möglicherweise möchten Sie dies auch 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.

Das Einstellen der Dauer ist nicht erforderlich, da ffmpeg nur das verwendet, was für das Video erforderlich ist. slhck vor 9 Jahren 0
Ich hielt die Dinge im zweistufigen Prozess, wie Ivan es getan hatte. Wenn Sie die Dauer in meinem Befehl weglassen, weiß ich nicht, wie lange ffmpeg laufen würde (wahrscheinlich länger als Sie möchten). dstob vor 9 Jahren 0