Ich baue eine neue Medienseite auf und lasse mich von YouTube inspirieren, welche Videodateiformate ich anbieten sollte, damit sie für mobile und Desktop-Clients weit verbreitet sind. Ich mache die gesamte Transcodierung mit ffmpeg
. Mein Problem ist, dass die .3gp-Dateien von YouTube eine Codec-ID von „3gp6“, ein Videoformat von „MPEG-4 Visual“ und ein Videoformatprofil von „Simple@L1“ (mit mediainfo
dem die Dateien abgefragt werden) haben. Ich weiß nicht, mit welchen ffmpeg
Einstellungen ich das reproduzieren kann.
Wenn ich -vcodec libx264 -profile:v baseline -level 1
in meinem ffmpeg
Befehl verwende, kommt die Datei mit der richtigen Codec-ID heraus, aber das Videoformat ist "AVC" und das Profil ist "Baseline@L1.0".
Wenn ich alternativ verwende -vcodec mpeg4 -profile 0 -level 1
, sind das Videoformat und das Profil korrekt, aber die Codec-ID lautet „3gp4“ anstelle von „3gp6“.
Meine Frage ist also, wie kann ich verwenden ffmpeg
, um zu einer Codec-ID von 3gp6 zusammen mit einem Format von MPEG-4 Visual und einem Profil von Simple@L1 zu gelangen? Ich habe stundenlang erfolglos gegoogelt und experimentiert.
Warum sollten Sie Ihre Videos zunächst im .3gp-Container haben? Heutzutage ist es ein sehr irrelevantes Format, es gibt praktisch kein Gerät, das den 3GP-Container unterstützt, aber nicht gleichzeitig MP4. Es ist nichts anderes als eine enge Ableitung von MP4, es sind sehr ähnliche Containerformate, die denselben Codec enthalten. Wenn Sie viele Geräte mit h264 im mp4-Container unterstützen möchten, öffnet sich Ihre Website für die meisten mobilen und Desktop-Geräte. Außerdem bietet vp8/webm Kompatibilität zu Open-Source-Software, die sich keine h264-Lizenz leisten kann oder nicht möchte h264 verwenden. Mit diesen beiden Formaten decken Sie jeden relevanten Markt ab.
http://caniuse.com/#feat=mpeg4
3gp ist ein veraltetes Format für ältere Telefone, lange vor der Android- und iOS-Ära, als YouTube neu war und anfing, ein wenig mobile Unterstützung hinzuzufügen, und es ist fast identisch mit MP4, einige Hersteller benennen ihre 3gp-Dateien sogar mit der Erweiterung .mp4 ( wiki )
Beachten Sie auch, dass die Tatsache, dass Ihre Dateien dieselben Metainformationen wie die von YouTube haben, kein Indikator dafür ist, ob sie kompatibel sind oder nicht, YouTube verwendet einen anderen Encoder als Sie und der Encoder schreibt andere Informationen als x264 in ffmpeg. Wenn Ihre Datei die Spezifikationen eines bestimmten Formats erfüllt, ist sie kompatibel, so einfach ist das. Wenn Sie sicher gehen wollen, dass Sie keine ausgefallenen Formatfunktionen verwenden, verwenden Sie einfach ein niedriges Profil (z. B. Baseline im Fall von h264), um die Kompatibilität mit praktisch jedem Gerät sicherzustellen. Je niedriger das Profil, desto weniger Funktionen sind zulässig.
Wenn Sie WIRKLICH 3GP verwenden müssen, können Sie den Container mit der Option angeben -f 3gp
. Die Verwendung des Profils BaseLine 1 ist absolut ausreichend. Wenn Sie eine ffmpeg-Befehlszeile wie die folgende verwenden, erhalten Sie das, was Sie brauchen:
ffmpeg -i input.mp4 -vf scale=320:240 -vcodec mpeg4 -acodec aac -strict -2 -f
3gp output.3gp
Beachten Sie die Verwendung von mpeg4
anstelle von libx264. Der mpeg4
Encoder ist der Mpeg4 Part 2-Codec, auch bekannt als h263. Auch hier unterstützen heutzutage nur sehr wenige Geräte h264 nicht, und ich kann nur raten, h263 im 3gp-Container zu unterstützen, wenn Sie dies dringend benötigen oder eine extrem große Benutzerbasis haben, die in die Zehnmillionen von Benutzern zählt.
3gp6 anstelle von 3gp4 zu haben, ist irrelevant, Sie zielen auf alte Geräte ab, sodass die Verwendung der neuesten Version des Standards nicht viel Sinn macht. FFmpeg wird den 3gp6-Container nur verwenden, wenn der ebenfalls neuere Codec h264 verwendet wird, für den Release 6 ebenfalls gedacht ist.
Hier und Auszug aus dem 3gpp v6 Standard:
Specific MBMS Rel-6 application codecs are introduced, like for example audio codecs Extended AMR-WB (AMR-WB+), Enhanced aacPlus and video codec H.264/AVC.
Wenn Sie also nicht h264 verwenden, müssen Sie Release 6 nicht verwenden, und Sie können bei Release 4 bleiben, ohne auf Probleme zu stoßen. Das Gegenteil ist der Fall, je älter die Version, desto mehr alte Geräte werden Sie unterstützen.
Ich habe auf der Mailingliste ffmpeg-users nachgefragt, und es wurde vorgeschlagen, dass ich -brand 3gp6
meinen Codierungsbefehl hinzufüge. Dadurch wurde das Ergebnis erzielt mediainfo
, nach dem ich gesucht hatte. Ob damit aber wirklich die Kompatibilität zu älterer Hardware erreicht wird, die YouTubes 3GP-Dateien haben, bleibt abzuwarten. Ich habe keine alte Hardware zum Testen, lol. Wie auch immer, für mich ist das Problem vorerst gelöst!
Wenn es jemanden interessiert, hier ist der Befehl, den ich zum Reproduzieren von YouTubes "Format 36" erhalten habe, bei dem es sich um ein 360 x 180 3GP-Video mit einer Gesamtbitrate von etwa 230 Kbps handelt:
ffmpeg -i input-file.mov -vcodec mpeg4 -s 320x180 -qscale:v 20 -brand 3gp6 \
-vf 'scale=iw*sar:ih,pad=max(iw\,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2' \
-acodec libfaac -ar 22050 -ac 1 -qscale:a 70 output-file.3gp
Und hier ist, was ich mir ausgedacht habe, um sein „Format 17“ zu reproduzieren, das ein 176 x 144 3GP-Video mit einer Gesamtbitrate von etwa 82 Kbps ist:
ffmpeg -i input-file.mov -vcodec mpeg4 -s 176x144 -qscale:v 12 -r 10 -level 8 -brand 3gp6 \
-vf 'scale=iw*sar:ih,pad=max(iw\,ih*(11/9)):ow/(11/9):(ow-iw)/2:(oh-ih)/2' \
acodec libfaac -ar 22050 -ac 1 -qscale:a 45 output-file.3gp
Falls Sie sich fragen, erkennt dieses massive "-vf"-Argument automatisch Nichtübereinstimmungen in den Seitenverhältnissen zwischen Eingabe und Ausgabe und boxt die Ausgabe, wenn sie sich unterscheiden.
curtisdf
Timonku
curtisdf
Timonku
Timonku