Konvertieren Sie .WMV mit FFmpeg

Ich möchte FFmpeg in der Mac-Terminal-Befehlszeile verwenden, um eine .WMV-Datei zu konvertieren. Die Syntax ist mir bekannt:

ffmpeg -i /path/OriginalMovieFile.wmv /path/NewMovieFile.???

Mein letzter Versuch, eine 38-MB-WMV-Datei in eine .MP4-Datei zu konvertieren, führte jedoch zu einer 800-MB-Datei, die nicht abgespielt werden konnte. Vielleicht ist in meiner obigen Syntax ein Fehler. Oder vielleicht muss ich ein spezielles Paket für den Umgang mit .WMV installieren.

Wie kann ich .WMV-Dateien mit FFmpeg von der Mac-Terminal-Befehlszeile konvertieren?

Bitte geben Sie die vollständige Konsolenausgabe Ihres Befehls an. Sie können die Option hinzufügen -t, ob eine kurze Kodierung ausreicht, um das Problem zu erklären.

Antworten (2)

wmv wird von ffmpeg oft als 90k FPS erkannt. (Das ist ein Platzhalterwert, da der Demuxer nicht sofort in den Stream schaut, um die Intervalle zwischen den ersten Frames zu sehen).

Die Standardeinstellung von ffmpeg für die mp4-Ausgabe ist der CFR-Modus, bei dem Frames hart dupliziert werden, um die Framerate zu erhöhen (in diesem Fall auf 90000 FPS). Selbst die effizientesten Codecs benötigen ein paar Bytes, um einen Frame zu codieren, der ein exaktes Duplikat des vorherigen ist.

-vsync vfr(dasselbe wie -vsync 2) in der Befehlszeile sollte das Problem beheben (indem ffmpeg keine Frames löschen oder duplizieren lässt, sondern stattdessen nur die Eingabezeitstempel für die Ausgabeframes verwendet). Es kommt nach der Eingabedatei, aber vor der Ausgabedatei, da es sich um eine Ausgabeoption handelt.

Ansonsten finden Sie unter https://trac.ffmpeg.org/wiki/Encode/H.264 zum Beispiel, wie Sie Einstellungen auswählen, die für das, was Sie tun, geeignet sind. (z. B. -preset veryslowum viel CPU-Zeit für eine einmalige Codierungsaufgabe aufzuwenden, bei der der Qualitätsgewinn pro Dateigröße viele Male davon profitiert.)

Diese Erklärung ist unwahrscheinlich, da 1) H264 selbst auf Stufe 5.2 maximal 530 Millionen Luma-Samples pro Sekunde unterstützt, sodass eine Ausgabe von 90.000 fps auf eine Auflösung von weniger als 102 x 58 beschränkt ist, und 2) ich viele WMVs codiert habe, die ein tbn und tbc melden von 1K (und sogar einigen 90Ks), und ich habe noch nie eine aufgeblähte Ausgabe wie das OP erhalten - ich gebe keine Framerate als Ausgabeflag oder Filter an.
@Mulvya: Ich habe das kürzlich nicht selbst mit ffmpeg getestet, aber mplayerfrüher wurden die fps von wmv-Dateien als 90k angezeigt. Tatsächlich glaube ich, dass ich so etwas mit mp4-Ausgabe und einer tatsächlichen VFR-mp4-Eingabe gesehen habe. Welches Ausgabeformat verwenden Sie, wenn Sie aus einer WMV-Quelle codieren? Der Standardwert von ffmpeg für die meisten Muxer ist -vsync vfr, wurde aber -vsync cfrfür mp4 als Problemumgehung für einige Fehler geändert, die in einem Eckfall auftreten können. zu 1) : Diese Ausgabedatei ist wahrscheinlich nicht annähernd Level 5.2, wenn meine Theorie stimmt. Wenn ffmpeg / x264 es als solches kennzeichnen, ist das ein Fehler.
Meine Ausgabe war normalerweise H264 in MP4 oder MOV. Mein Punkt in Bezug auf Level war, dass es sehr unwahrscheinlich war, dass ffmpeg versuchte, eine fps von 90K als Ausgabe zu verwenden, und sei es nur aus dem einfachen Grund, dass diese Framerate selbst auf der höchsten Stufe von 5,2 nur eine sehr niedrige Auflösung und die Codierung zulassen würde sollte von Anfang an fehlschlagen, anstatt eine aufgeblähte Datei auszugeben.
@Mulvya: Wahnsinns-Framerate h.264 ist immer noch gültig h.264, es gibt einfach kein Level, das es beschreibt. Ich glaube, ich erinnere mich jetzt an mindestens eine weitere Frage hier, bei der ffmpeg eine viel zu hohe Bildrate verwendet und eine riesige Datei erstellt hat. Diese Frage hatte eine vollständige ffmpeg-Ausgabe, sodass wir sehen konnten, dass das tatsächlich passiert ist. Ich stimme zu, dass ffmpeg in einer idealen Welt in der Lage wäre, zu erkennen, wann dies versehentlich passiert ist, und abzubrechen, ohne die Aufforderung zu erfüllen, ob Sie wirklich darum gebeten haben , eine CFR-Ausgabedatei mit 90.000 fps zu erstellen.

Beide avconvund ffmpegleiden unter den schlecht gewählten Standardeinstellungen für jeden Container und Codec. Daher sollten Sie den Befehl nicht einfach in dem von Ihnen vorgestellten Format geben, sondern ihm auch sagen, was zu tun ist.

Ich verwende avconv, aber wenn Sie es immer noch verwenden, ffmpegist das Format ziemlich ähnlich, also sollten Sie folgen können.

Sie müssen die Audioeinstellungen angeben. In vielen Fällen möchten Sie Ihr Audio kopieren, ohne es tatsächlich neu zu codieren. Dies geschieht über -c:a copy. Zum Beispiel:

avconv -i video.wmv -c:a copy (...) video.mkv

Dies war keine vollständige Linie, also versuchen Sie es noch nicht.

Sie können Ihr Audio auch neu codieren, in diesem Fall sollten Sie lieber copyden Namen des Codecs verwenden (oder aus irgendeinem Grund oft die Bibliothek, die die Codierung durchführt). Sie können zum Beispiel schreiben:

avconv -i video.wmv -c:a libvorbis (...) video.mkv

Dies führt jedoch zu keinen guten Ergebnissen, da wir keine Parameter für die Audiokonvertierung angegeben haben. Lassen Sie uns einfach eine Qualitätseinstellung vornehmen, und dann sind wir mit Audio fertig:

avconv -i video.wmv -c:a libvorbis -q:a 3 (...) video.mkv

Jetzt das Video. Das können wir oft auch einfach kopieren, aber das ist selten das, was wir wollen. Wenn Sie die Datei nur remuxen möchten (d.h. Sie möchten das Format ändern, aber nicht die Codecs), können Sie Folgendes tun:

avconv -i video.wmv -c:a copy -c:v copy video.mkv

Wie Sie sehen, haben wir sowohl Video als auch Audio kopiert und in die neue Datei im Matroska-Format eingefügt. Diese Befehlszeile funktioniert bereits, und Sie können es versuchen.

Sie sollten bedenken, dass nicht jedes Format jeden möglichen Codec verarbeiten kann, einige von ihnen sind wählerischer als andere.

Angenommen, Sie möchten das Video jetzt in etwas umcodieren. Persönlich bevorzuge ich libtheora, da es sich um einen kostenlosen Codec handelt, aber Sie können andere Vorlieben haben. Ich lasse Sie selbst entscheiden, welche Sie verwenden.

Wir können also so etwas haben:

avconv -i video.wmv -c:a copy -c:v libtheora -q:v 8 video.mkv

Dort habe ich darum gebeten avconv, das Audio zu kopieren, aber das Video mit der Bibliothek libtheoraund Videoqualität von 8 neu zu codieren. Das Ganze wird in video.mkv gespeichert, was bedeutet, dass es eine Matroska-Datei ist.

Sie können mit den Einstellungen herumspielen, aber Sie sollten sehr selten Standardvoreinstellungen verwenden. Und denken Sie daran, dass selbst wenn das Dateiformat für die Ausgabe dasselbe ist wie für die Eingabe, avconv es standardmäßig neu codiert wird. Wenn Sie Streams kopieren möchten, sollten Sie dies manuell angeben.