Welche ffmpeg-Befehlszeile erzeugt Videos, die auf allen Geräten kompatibler sind?

15

Ich habe also Benutzer, die sagen, dass H264-Videos MP4s auf dem iPad von Apple kein Audio abspielen, und ich habe Schwierigkeiten, MP4-Videos auch auf Android richtig abzuspielen.

Es gibt zwei verschiedene Befehlszeilen, welche Befehlszeile ich verwenden sollte.

-profile:v baseline -level 3.0

Und :

-vpre baseline

Was sollte ich verwenden, damit es auf allen Geräten funktioniert?

Ich habe auch gelesen, dass es die Audio-Bitrate sein könnte, die meine aktuelle Audio-Bitrate ist

-ab 192k

Vielleicht sollte ich es auf senken

-ab 160k

Befehlszeile zum Codieren von MP3-Audio in MP4-Dateien.

"C:/server/ffmpeg/bin/ffmpeg.exe" -y -i Z:/server/websites/ps/public_www/media/com_hwdmediashare/files/55/ac/fb/54bbf30bb11a0f6b9dc832114c26fd29.mp4 -strict experimental -acodec libmp3lame -ar 44100 -ac 2 -ab 192k -s 480x360 -aspect 16:9 -r 24000/1001 -vcodec libx264 -b:v 1000k -minrate 800k -maxrate 1000k -bufsize 800K -crf 18 -preset veryslow -f mp4 -threads 0 -movflags +faststart Z:/server/websites/ps/public_www/media/com_hwdmediashare/files/55/ac/fb/98382d43d31d4ff91ea44cb2aa1bbc49.mp4 2>&1
C0nw0nk
quelle

Antworten:

25

Zunächst sollten Sie den Unterschied zwischen der Verwendung von FFmpeg-Profilen und den direkten Befehlszeilenoptionen verstehen. -vpreverwendet eine .ffpresetDatei, die sich in /usr/share/ffmpeg/oder überall dort befindet, wo ffmpeg installiert wurde. Es handelt sich um eine Reihe von Option = Wert- Paaren, und in Ihrem Fall hätten Sie es selbst definieren müssen (zumindest kenne ich kein baselinemit ffmpeg geliefertes Preset).

Ich würde empfehlen, keine Voreinstellungen zu verwenden, es sei denn, Sie haben sie selbst erstellt und wissen, wozu die Befehlszeilenoptionen dienen. Ich benutze ffmpeg seit Jahren und habe nie Presets verwendet - ich musste es nie wirklich.

Eine typische Befehlszeile zum Generieren von H.264-Videos, die mit den meisten Geräten kompatibel sind, lautet:

ffmpeg -i <input> \
  -c:v libx264 -crf 23 -profile:v baseline -level 3.0 -pix_fmt yuv420p \
  -c:a aac -ac 2 -b:a 128k \
  -movflags faststart \
  output.mp4

Einige Notizen:

  • H.264 / AAC ist die beste Kombination für eine breite Unterstützung in HTML5. Browser ohne H.264-Decoder benötigen jedoch auch ein VP8 / Vorbis-Video. Einige Befehlszeilenbeispiele finden Sie in dieser Antwort . Weitere Codecs finden Sie auch auf der Browser-Support- Seite von Wikipedia.

  • H.264 funktioniert auch auf Mobilgeräten.

  • Die Optionen -profile:v baselineund -level 3.0werden nur für alte mobile Geräte benötigt, die keine CPU-intensiven Funktionen von H.264 verarbeiten können. Sie können diese normalerweise weglassen oder stattdessen verwenden -profile:v main.

  • Das CRF legt die Qualität fest (18–28 ist ein angemessener Bereich, niedriger bedeutet bessere Qualität). Sie können natürlich auch eine feste Bitrate mit -b:v 1000koder ähnlichem verwenden. Wählen Sie eine Bitrate, die der Auflösung des Videos entspricht. Einige Geräte mit geringem Stromverbrauch sind möglicherweise nicht in der Lage, unnötig hohe Bitraten zu verarbeiten.

  • Die -movflags faststartOption ist für das Streaming, da sie die Container Metadaten an den Anfang der Datei statt so dass es am Ende bewegt. Dadurch kann die Wiedergabe sofort gestartet werden, anstatt warten zu müssen, bis die Datei vollständig geladen ist.

Es kommt jedoch darauf an, den kleinsten gemeinsamen Nenner für alle Geräte zu finden, auf die Sie abzielen, die möglicherweise nicht immer vorhanden sind. Sicherlich möchten Sie keinen anderen ( dh schlechteren ) Codec als H.264 verwenden. Tatsächlich wäre es auch nicht ratsam, Clients, die Main oder High Profile dekodieren können, Baseline-codiertes Video anzubieten. Sie würden Qualität gegen reduzierte Dekodierungskomplexität abwägen.

Nach meiner Erfahrung können Android-Geräte Baseline H.264 mit AAC-LC-Audio in einem MP4-Container problemlos wiedergeben. Ich hatte noch nie Probleme damit. In der Tat können einige Geräte auch höhere Profile spielen, obwohl dies nicht offiziell unterstützt wird. iOS unterstützt im Allgemeinen auch Baseline H.264, aber Sie können das Hauptprofil auf einigen Geräten auch verwenden. In diesem Beitrag (der etwas veraltet ist) finden Sie einige Richtlinien.

Wenn Sie Benutzer mit Wiedergabeproblemen haben, müssen Sie herausfinden, welches Video Probleme verursacht, und weitere Details zu der von ihnen verwendeten Hardware und Player-Software erhalten. Dann könnten wir über die Fehlerbehebung in diesem speziellen Fall sprechen.

slhck
quelle
1
Vielen Dank für diese detaillierte Antwort, die ich immer wieder lese :) Außerdem codiere ich mit -acodec libmp3lame -ab 160k und Benutzer, die iPad-Apple-Geräte verwenden, sagen, sie könnten das Video sehen, aber keinen Ton hören, also nehme ich an, dass es etwas damit zu tun hat der Audio-Codec oder die Bitrate. Android- und Windows-Benutzer sagen, dass dies in Ordnung ist und sie Audio zum Videostream haben. Daher bin ich mir nicht sicher, warum die Verwendung von libmp3lame anstelle von aac dazu führen würde, dass Apple-Benutzer kein Audio zum Video haben.
C0nw0nk
Ich habe selten MP3-Audio in MP4-Containern gesehen. Vielleicht ist AAC die sicherere Wahl.
Slhck
Nun, ich benutze nur MP3, weil ich immer wieder Bit_rate, Breitenhöhenfehler mit aac bekam. Ich wechselte zu libmp3lame und all diese Fehler hören auf und dann sagen Apple-Benutzer, dass sie kein Audio haben, aber alle anderen können dieselbe Datei sehen und es ist in Ordnung mit Sound Auf allen anderen Geräten habe ich vielleicht einen Fehler gefunden, der weiß :( Und laut Apple sollte MP3 in Ordnung sein. developer.apple.com/library/mac/documentation/…
C0nw0nk
@ user2068371 Dieser Link bezieht sich auf den MPEG-2-Transportstrom und nicht auf das MP4-Containerformat.
llogan
1
@ user2068371 Ich hatte noch nie Probleme mit MediaElementjs. H.264 und MP3 werden nicht in allen Browsern unterstützt . Verwenden Sie für HTML5-Videos immer H.264 / AAC und möglicherweise VP8 / Vorbis als Fallback. Wenn Sie Probleme mit einer AAC-Konvertierung haben, stellen Sie bitte eine neue Frage dazu und stellen Sie sicher, dass auch die vollständige Befehlszeilenausgabe enthalten ist.
Slhck