YouTube 3gp-Codierungseinstellungen

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 mediainfodem die Dateien abgefragt werden) haben. Ich weiß nicht, mit welchen ffmpegEinstellungen ich das reproduzieren kann.

Wenn ich -vcodec libx264 -profile:v baseline -level 1in meinem ffmpegBefehl 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.

Antworten (2)

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

http://caniuse.com/#feat=webm

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 mpeg4anstelle von libx264. Der mpeg4Encoder 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 bin mir nicht sicher, warum YouTube immer noch 3GP-Formate anbietet, aber da sie es Ende 2014 immer noch tun, schätze ich, dass es dafür einen guten Grund gibt. Sie zielen nicht nur auf die USA ab, wo Smartphones reichlich vorhanden sind. Sie zielen auch überall sonst ab, wie Länder der Dritten Welt, in denen angeblich "dumme" Telefone alles bieten, was Internetmenschen bekommen können. Vielleicht ist dies der Zweck von YouTube, immer noch 3GP zu tragen. Meine Website richtet sich auch an das Weltpublikum. Und ich mache nicht nur 3GP. Ich mache auch MP3, WEBM und FLV wie YouTube. Es ist nur der 3GP-Teil, an dem ich feststecke.
Der einzige Grund ist für wirklich alte Telefone, dass sie nur ihre mp4-Codierungen remuxen müssen, damit es kaum zusätzliche Arbeit gibt, wäre nicht überrascht, wenn sie nicht nur ein paar Bytes im Header ändern würden. Es gibt einen sehr kleinen Prozentsatz von Telefonen, die 3gp, aber nicht mp4 unterstützen. Was ist Ihr Grund für diese enorme Kompatibilität, besteht Ihre Zielgruppe hauptsächlich aus Benutzern älterer Geräte?
Es ist im Namen, das größtmögliche Publikum zu erreichen. Aber ich erkenne an, dass die letzten X Prozent möglicherweise zu viel Mühe erfordern, um sie zu erreichen. Wenn es jedoch einen "einfachen" Weg gibt, ffmpeg zu zwingen, mir 3gp6-Dateien mit MPEG-4 Visual und Simple@L1 zu geben, würde ich es gerne versuchen.
Ich habe Informationen darüber hinzugefügt, wie Sie Ihre Videos so codieren können, aber noch einmal, Sie sollten auf jeden Fall sehen, ob sich das wirklich lohnt. Es ist wie Optimierungen für IE6 und 7.
Eine weitere Änderung bezüglich 3gpp v6 vs. v4

Ich habe auf der Mailingliste ffmpeg-users nachgefragt, und es wurde vorgeschlagen, dass ich -brand 3gp6meinen 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.