FFMPEG konvertiert flv in mp4 ohne Qualitätseinbußen [duplizieren]

55

Diese Frage hat hier bereits eine Antwort:

Derzeit konvertiere ich FLV-Flash-Dateien in WEBM- und MP4-Dateien, um sie mit einem HTML5-Videoplayer zu verwenden.

_

Ich benutze diesen ffmpeg-Befehl für WEBM: Das ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis filename.webm funktioniert hervorragend und die Dateigröße bleibt relativ gleich (wichtig).

_

Für MP4 verwende ich Folgendes: ffmpeg -i filename.flv -sameq -ar 22050 filename.mp4

Es konvertiert in .mp4 fine und verhindert Qualitätsverluste, aber die Dateigröße verdreifacht sich fast.

Mit welcher ffmpeg-Formel können Sie in MP4 konvertieren, ohne zu viel Qualität zu verlieren und eine viel höhere Dateigröße zu verhindern?

Chad Whitaker
quelle

Antworten:

57
ffmpeg -i filename.flv -c:v libx264 -crf 19 -strict experimental filename.mp4

Sie müssen den verwendeten Videocodec angeben. In Ihrem Befehl geben Sie nicht an, -vcodecoder -c:vso verwendet ffmpeg den Standardcodec für MP4 ( mpeg4), der keine sehr gute Komprimierungseffizienz aufweist. Verwenden Sie stattdessen libx264 und stellen Sie die CRF ein, bei der es sich um die Qualitätsstufe handelt (niedriger ist besser, Standard ist 23 und normale Werte liegen zwischen 18 und 28).

Die Codierung mit libx264 ist recht komplex. Lesen Sie daher die Anleitung zur H.264-Codierung .

Sie müssen auch angeben, dass -strict experimentalansonsten möglicherweise Folgendes angezeigt wird: "Der Encoder 'aac' ist experimentell, aber experimentelle Codecs sind nicht aktiviert. Fügen Sie '-strict -2' hinzu, wenn Sie ihn verwenden möchten."

Sashoalm
quelle
1
Das dauert so lange und das resultierende mp4 ist sehr verzerrt, Pixel verloren etc .. Irgendwelche Ideen, warum das so sein könnte? : /
trainoasis
Der Standardvideocodec für das mp4-Format ist nicht unbedingt erforderlich mpeg4. Laut der Ausgabe von ffmpeg --help muxer=mp4auf meinem Computer verwendet ffmpeg h264 als Standardvideocodec von mp4.
DoubleDown
1
@doubleDown Meine Antwort ist alt - von 2011. Sie haben wahrscheinlich irgendwann seitdem die Standardeinstellungen geändert.
Sashoalm
43

Dieser Befehl ändert nur den Container ohne erneute Kodierung

ffmpeg -i input.flv -codec copy output.mp4
c97
quelle
Würdest du eine Möglichkeit kennen, ein Skript für die Stapelkonvertierung vieler Videos im selben Ordner zu erstellen?
bis zum
Ja, unter Windows erstellen Sie die Datei convert.bat und fügen Sie den folgenden Code ein: for %%a in ("*.flv") do ffmpeg -i "%%a" -codec copy "%%~na.mp4"Führen Sie anschließend convert.bat in einem Ordner mit * .flv-Dateien aus
c97
1
Für mich löst dies aus. Header für Ausgabedatei Nr. 0 konnte nicht geschrieben werden (falsche Codec-Parameter?): Ungültiges Argument. Irgendwelche Ideen? : /
trainoasis
2
@trainoasis Ihr .flv enthält kein H.264-Video und kein AAC-Audio. Das Kopieren der unberührten Audio- / Videodaten -codec copyin eine .mp4-Datei funktioniert nur in den seltensten Fällen, in denen Audio und Video bereits mit H.264 und AAC codiert sind . Siehe superuser.com/a/1009539/390946 und addpipe.com/blog/flv-to-mp4 .
Octavian Naicu
3

avconvund ffmpegsind im Wesentlichen das gleiche. [Stand vor kurzem gibt es einige Unterschiede, aber nicht wirklich viel über die Heimat zu schreiben , wenn Sie selbst kompilieren ffmpeg[die man in Ubuntu repos vorgesehen zum Beispiel alt und leidet an dieser Videogröße ist kein bla bla bla Deal [im Grunde versucht , um Ihnen zu sagen, dass das Video falsche Proportionen hat], aber wenn Sie sich die Mühe machen, das ffmpegKompilierungshandbuch zu lesen und es aus git zu kompilieren, hat es keine der Probleme der älteren Versionen, die in den meisten Betriebssystemen auf Lager sind. Die Abschreibungswarnung, auf die Bezug genommen avconvwird, besagt, dass sie ein neueres Dienstprogramm erstellt haben, um zu versuchen ffmpeg, es zu ersetzen , ABER es wird SO ausgiebig verwendet, dass wir alle Softlinks von avconvbis erstellen würden, selbst wenn sie es abschneiden wolltenffmpeg sowieso werden sie nicht aufhören zu arbeiten und es fallen lassen.]]

Es ist keine schlechte Sache zu verwenden avconv, ich habe nur die eine Antwort gesehen, in der die Abschreibungswarnung erwähnt wird, die im Wesentlichen eine leere Nachricht ist. Dies ist eher eine Alternative zu ffpmeg. Sie könnten avconv ausprobieren, was hier zutreffender ist.

avconv -i inputfile.flv -map 0 -c:v libx264 -c:a copy outputfile.mp4

ist wirklich das GLEICHE wie

ffmpeg -i filename.flv -vcodec libvpx -acodec libvorbis

Im Wesentlichen verwenden Sie in der ersten Variante die Optionen für kürzere Hände und in der zweiten Variante die mehr ausgeschriebene Variante.

AUCH -map 0bezieht sich auf Audiospuren. Wenn Sie also etwas verwenden, mp4adas mit mehreren Audiospuren gut zurechtkommt, können Sie dies auslassen, um alle Audiostreams in die resultierende Datei zu kopieren. Dies ist nur erforderlich, wenn Sie einen Codec verwenden, der nicht mehrere Audiospuren in derselben Datei unterstützt. Dann möchten Sie das benötigte Audio zuordnen und nicht alle. Wenn Sie versuchen, den verwendeten Speicherplatz zu minimieren, können Sie natürlich nur einen angeben, um zu versuchen, ein wenig Größe aus der Datei zu entfernen [Audio entspricht vielleicht einem Drittel der Größe der Videospur [und das ist großzügig]].

-c:v = codec(video)also: -c:v libx264ist gleichbedeutend mit: -vcodec libx264FYI; Gleiches gilt für dieses Beispiel:-c:v copy = -vcodec copy

und für FLVs sei außerdem vorsichtig, die FLV-Datei ist insofern die gleiche wie eine AVI-Datei, als sie ein Container ist, der eine beliebige Anzahl von Codecs für Video oder Audio enthalten kann. Sie sollten zuerst das Dienstprogramm zur Medieninspektion Ihrer Wahl verwenden, um zu sehen, was in der Datei selbst verwendet wird, bevor Sie den Video- und / oder Audiostream kopieren oder ihn von einem beliebigen Ort auf einen neuen übertragen möchten. Daher ist der Befehl, der für ein FLV am besten funktioniert, möglicherweise nicht der gleiche für ein anderes FLV [natürlich werden mehrere FLVs, die von derselben Quelle stammen, normalerweise auf dieselbe Weise codiert, dies ist jedoch keine Garantie].

Nicht zu versuchen, etwas herauszusuchen, ist gerade in der Websuche darauf gestoßen und wollte versuchen, die Dinge für die Leute ein wenig zu klären.

Wieder wie diese Antwort für die Antwort unterhalb dieses ein JA besagt, wird ffmpeg immer diese Nachricht posten, es ist im Wesentlichen hohl, da diese 2 Utils wirklich immer noch genau das gleiche util sind, mit sehr wenig Unterschied. In fast allen Fällen sollten Sie mit beiden Befehlen genau die gleichen Ergebnisse erzielen. Dies führt nicht unbedingt zu einer vollständigen Neukodierung. Warum? A: Wenn es nicht benötigt wird, spart es eine Menge Zeit. B: Wenn Sie eine Datei, in die es bereits komprimiert wurde, erneut in einen Videocodec umcodieren, führen Sie im Wesentlichen eine Komprimierungsroutine für etwas aus, das bereits komprimiert ist und immer das Ergebnis ist in weniger Qualität als die Quelle. Die meisten neueren Codecs sind etwas kreuzkompatibel [nicht alle], wie zum Beispiel ein FLV technisch gesehen ein MP4 in einem FLV-Wrapper sein könnte, da FLVs wie AVIs nur Container anderer Codecs sind. Damit, es hängt davon ab, was das Quell-FLV für den Video- und Ausio-Codec hat, im Vergleich zu dem, in das Sie es konvertieren, um festzustellen, ob es überhaupt transcodiert werden muss. Wenn sie innerhalb des FLV das H264 MP4-Video und MP4a für Audio verwenden würden, müssten Sie das, was Sie nur kopieren müssten, nicht erneut umcodieren und die Dateiköpfe so anpassen, dass es als echtes MP4-Video anstatt als MP4-Video gelesen wird in einer FLV-Datei.

Paria
quelle
3

Laut dieser Anleitung lautet der richtige Befehl zum Konvertieren von FLV in MP4 ohne AV-Rekodierung wie folgt:

ffmpeg -i input.flv -c copy -copyts output.mp4

Bei AVC-Video und AAC- oder MP3-Audio hat es in allen Fällen perfekt funktioniert.

Al Kepp
quelle
-1

Wenn ich ffmpeg benutze, wurde ich gewarnt, dass ich avconv verwenden soll. Mit avconv habe ich gute Ergebnisse erzielt:

avconv -i Eingabedatei.flv -map 0 -c: v libx264 -c: eine Kopie der Ausgabedatei.mp4

Lesen Sie man avconvfür weitere Informationen.

gare_c
quelle
1
ffmpegselbst ist nicht veraltet . Der Grund dafür ist, dass Sie den x264-Encoder mit guten Standardeinstellungen für die Qualität angeben.
Slhck
-2

Ich schlage vor, Sie erstellen ein Shell-Skript video_flv_to_mp4mit folgendem Inhalt:

ffmpeg -i $1 -sameq -ar 22050 -vcodec libx264 $1.mp4 

Dann führe es so aus:

$ video_flv_to_mp4 video.flv

Sie erhalten eine video.flv.mp4-Datei.

Thibault
quelle
4
-sameqist keine gültige Option mehr für ffmpeg. Es bedeutet auch nicht "gleiche Qualität". Siehe auch diesen Beitrag .
Slhck