Best Practices zum Teilen von Videos

Viele Nutzer teilen Videos über ihr Android-Gerät. Die Qualität des empfangenen Videos ist aufgrund der Verarbeitung durch die Sharing-App häufig schlechter als das Original. In diesem Dokument wird beschrieben, wie du die Qualität geteilter Videos optimieren kannst und wie du häufige Probleme bei der Videoverarbeitung vermeiden kannst. Informationen zur Optimierung der Freigabe von HDR-Videoinhalten finden Sie auf dieser Seite unter HDR in SDR mit dem Transformer-Modul transkodieren.

Das Wichtigste ist, bei der Vorbereitung des Teilens eine konstante Auflösung beizubehalten und die Videoqualität so lange wie möglich auf einer möglichst hohen Qualität zu halten.

Freigabepipeline

Abbildung 1 zeigt einen typischen Ablauf für die Freigabe eines Videos:

Videopipeline freigeben Abbildung 1: Die Pipeline für die Videofreigabe.

Die Pipeline umfasst folgende Schritte:

  1. Nimm ein Video auf und codiere und füge möglicherweise während der Aufnahme Effekte hinzu. Alternativ kann der Nutzer diesen Schritt überspringen und ein Video aus dem Speicher auswählen, das in einer anderen App aufgezeichnet wurde.
  2. Du kannst das Video bearbeiten, filtern, nachbessern oder anderweitig verarbeiten.
  3. Skalieren oder skalieren Sie das Video als Vorbereitung auf die Transcodierung.
  4. Transcodieren Sie das Video für die Freigabe. Die Filterung in Schritt 2 wird häufig als Teil dieses Schritts angewendet.

In der Pipeline gibt es zwei Schritte, in denen Sie Parameter festlegen können, die die Qualität Ihres Videos bestimmen: Codierung bei der ersten Aufzeichnung und Transcodierung vor der Freigabe. Außerdem müssen Sie das Video möglicherweise vor dem letzten Transcodierungsschritt neu skalieren, was sich ebenfalls auf die Qualität auswirken kann.

Empfehlungen

In Tabelle 1 sind die fünf Hauptparameter für die Videoqualität dargestellt. Außerdem ist angegeben, in welchen Schritten sie verwendet werden können.

Parameter Aufnehmen Teilen
Profil Y Y
Auflösung Y Y
Bitrate Y Y
Quantisierungsparameter (QP) (selten) Y
B-Rahmen N Y

Tabelle 1 Die wichtigsten Parameter für die Videoqualität

Profil

Bessere Ergebnisse erzielen Sie mit den erweiterten Profilen, die vom jeweiligen Codec bereitgestellt werden. Wählen Sie für die AVC-Codierung „High Profile“ und „Level 4“ aus.

Auflösung, Zuschneiden und Skalierung

Sie können die anfängliche Auflösung des aufgenommenen Videos vor dem Transcodieren für die Freigabe im Skalierungsschritt ändern. Die Skalierung kann jedoch die Qualität des Videos beeinträchtigen. Wir empfehlen, die Skalierung zu vermeiden und eine Auflösung für die anfängliche Codierung auszuwählen, die Sie in der gesamten Pipeline verwenden können. Beachten Sie auch, dass ein extremes Zuschneiden die Qualität des Bildes beeinträchtigt, insbesondere wenn Sie den Zuschnitt des Bildes entsprechend hochstufen. Beachten Sie die folgenden Richtlinien:

  • Wählen Sie eine Auflösung aus, die mindestens so groß wie die endgültige Auflösung für das Teilen ist.
  • Die Aufnahmeauflösung sollte die Freigabeauflösung nicht wesentlich überschreiten, es sei denn, alle Zwischenschritte sind darauf ausgelegt, die größere Auflösung zu unterstützen (z. B. die höhere Bitrate bei der ersten Aufnahme).

    • Wenn die Freigabecodierung eine Auflösung von 720 × 1280 ergibt, empfehlen wir eine Aufnahmeauflösung von 720 × 1280.
    • Wenn die Zwischenschritte zwischen der Aufnahme und dem Teilen das Zuschneiden umfassen, verwenden Sie eine höhere Aufnahmeauflösung (z. B. 1.080 × 1.920) und erhöhen Sie die Bitrate für die Aufnahme, um die zusätzlichen Pixel zu verarbeiten.
  • Durch extremes Zuschneiden wird die Bildqualität beeinträchtigt, insbesondere wenn das Bild zugeschnitten ist.

  • Vermeiden Sie es, von niedrigerer auf höhere Auflösung zu skalieren. Durch das Hochskalieren wird versucht, Details zu erzeugen, die nicht vorhanden sind. Die gewünschte höhere Auflösung von Anfang an übernehmen.

  • Wenn Sie eine Auflösung ausführen müssen, passen Sie die Codierungsparameter an. Wenn die hochskalierte Auflösung beispielsweise doppelt so viele Pixel hat, verdoppeln Sie die Bitrate.

Auflösung und Bitrate hängen zusammen. Wenn beispielsweise ein hochauflösendes Video über eine Freigabepipeline übertragen wird, die schließlich in eine niedrige Bitrate umgewandelt wird, ist die Qualität geringer, als wenn Sie mit einer niedrigeren Auflösung beginnen. Mit abnehmender Bitrate ergeben sich Übergangspunkte, an denen mit kleineren Auflösungen bessere Ergebnisse erzielt werden:

Bitrate Auflösung
5+ Mbit/s 1080 × 1920
1,5–5 Mbit/s und höher 720 × 1280
1,5 Mbit/s oder weniger SD-Äquivalent. Die gleiche Pixelzahl bei einem Seitenverhältnis von 9:16 beträgt etwa 416 × 736.

Tabelle 2 Bitrate und Auflösung im Vergleich

In vielen beliebten Apps werden Videos mit einer Auflösung von 720p oder weniger geteilt. Die Daten zeigen, dass eine Auflösung von 720p für Bitratenziele zwischen 1,5 und 5 Mbit/s eine geeignete Wahl ist.

Bitrate

Aufnahme läuft

Die größte Verbesserung der Videoqualität bietet eine höhere Bitrate für die Codierung. Wir empfehlen, Bitraten auszuwählen, die den nativen Kamera-Apps entsprechen. Für eine Auflösung von 720 x 1280 empfehlen wir eine Bitrate von 10 Mbit/s.

Da die Erfassungscodierung auf dem Gerät erfolgt, können Sie eine höhere Bitrate verwenden, um die meisten Transformationen des Freigabeschritts mit geringen negativen Auswirkungen zu kompensieren. Die größeren resultierenden Dateien werden nur zur Bearbeitung auf dem Gerät verwendet.

Sie können die Bitrate beim letzten Transcodierungsschritt reduzieren, wie in Tabelle 2 gezeigt.

Inhalte teilen

Die Bitrate hat den größten Einfluss bei der Freigabe, da sie direkt mit der Größe des hochgeladenen Videos zusammenhängt. Es gibt einen Kompromiss zwischen Videoqualität, Dateiübertragungszeit und Cloud-Speicherkosten.

Die Auswahl des Codierungsprofils, der B-Frames und der QP-Grenzwerte ist in dieser Phase auch wichtiger als dies während der Erfassung.

Für eine gute Bildqualität empfehlen wir eine Bitrate zwischen 4 und 5 Mbit/s (für eine Auflösung von 720 x 1280).

Quantisierungsparameter (QP)

Unter Android 12 und höher sind die QP-Schlüssel standardisiert und in der MediaFormat API und in der NDK-Mediabibliothek verfügbar. In früheren Android-Versionen ist die QP-Bearbeitung nur über Framework-Funktionen mit anbieterspezifischen Schlüsseln in der MediaFormat-Konfiguration möglich.

Aufnahme läuft

Verwenden Sie während der Videoaufnahme die Bitrate-Steuerung anstelle der QP-Einstellungen, die nicht immer verfügbar sind.

Wir raten davon ab, die QP-Einstellungen für Aufnahmebitraten von 10 Mbit/s (für 720 × 1280) anzupassen. Wenn die Bitrate für die Erfassung deutlich niedriger ist (unter 5 Mbit/s für 720 × 1280), ist eine QP-Einstellung von 40 ein guter Kompromiss zwischen einer höheren Qualität, ohne dass der Codec zu oft die Zielbitrate überschreitet.

Inhalte teilen

Wir empfehlen eine maximale QP-Grenze von 40, insbesondere wenn die Bitrate unter 4 Mbit/s liegt. Dies sorgt zwar für eine Mindestqualität der codierten Videos, kann aber zu einer höheren Bitrate führen. Wie Bitrate zunimmt, hängt von der Komplexität des Videos ab. Obwohl eine App zum Teilen von Inhalten eine gewisse Schwankung in der Bitrate des generierten Videos toleriert, toleriert sie möglicherweise keine Erhöhung über einen bestimmten Grenzwert hinaus.

Sie können die Erhöhung der Bitrate begrenzen, indem Sie das Video für die Freigabe mit einer weniger restriktiven (höheren) maximalen QP-Grenze neu codieren. Das gibt dem Codec mehr Freiheiten bei der Einbußen bei der Qualität und bei der Beibehaltung anderer Teile des Videos. Sie können das Video für die Freigabe neu codieren, da es sich um einen Transcodierungsvorgang handelt. Sie haben das Video, das Sie teilen möchten, bereits aufgenommen.

Der Nachteil besteht darin, dass die Wiederholung des Transcodierungsschritts mit diesen verschiedenen Parametern länger für das Teilen des Videos dauert. Eine Möglichkeit, diese Latenz zu verringern, besteht darin, anhand des teilweise transkodierten Videos zu entscheiden, ob es nicht in deinem Toleranzbereich für eine Überschreitung der Bitrate liegt. Ist dies nicht der Fall, können Sie die Transcodierung beenden und es mit geeigneteren QP-Parametern noch einmal versuchen.

B-Frames und Codierungsprofile

Erwägen Sie die Verwendung von B-Frames nur beim Teilen und nur dann, wenn Android 10 oder höher ausgeführt wird.

Apps sollten die unterstützten Codierungsprofile mit CodecCapabilities prüfen, da nicht alle Geräte Haupt- oder High-Profile unterstützen. Verwende das höchste Profil, das vom AVC-Encoder unterstützt wird: Hoch > Haupt > Baseline. Die sichersten Ergebnisse erzielen Sie, wenn Sie beim Verwenden des Basisprofils keine B-Frames (KEY_LATENCY oder KEY_MAX_B_FRAMES) konfigurieren, da einige Encoder unter Umständen nicht richtig konfiguriert werden.

In den folgenden Codesegmenten wird von einem 'MediaFormat format' ausgegangen, der zur Konfiguration des AVC-Encoders verwendet wird.

Android 10

API 29 oder höher

Verwenden Sie das höchste unterstützte Profil und setzen Sie den B-Frame-Parameter auf 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

Legen Sie in diesem Fall KEY_LATENCY nicht fest.

Android 8, 8.1 und 9

APIs 26, 27, 28

Verwenden Sie das Profil mit der höchsten Unterstützung, aber deaktivieren Sie die Generierung von B-Frames. Dadurch entstehen einige Einschränkungen im MediaMuxer in diesen Systemversionen

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

Der Wert KEY_LATENCY verhindert, dass die Codecs B-Frames generieren, nutzt aber weiterhin andere Codec-Effizienz.

Wenn Ihre App nicht MediaMuxer zum Zusammenstellen der endgültigen Ausgabedatei verwendet, können Sie B-Frames aktivieren. Dazu setzen Sie den Wert KEY_LATENCY auf 2 statt auf 1. So kann der Codec B-Frames erzeugen.

Android 7.1 und niedriger

API 25 und niedriger

Verwenden Sie das Basisprofil, um die sichersten Ergebnisse zu erhalten.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Vor Version 7 unterstützt Android AOSP nur das Basisprofil. Es ist jedoch wahrscheinlich, dass OEMs auf einigen Geräten ein Haupt-/High-Profil aktiviert haben, z. B. durch die Verwendung eines anbieterspezifischen Profils.

Wenn Ihre Anwendung MediaMuxer nicht verwendet, können Sie das Hauptprofil oder das allgemeine Profil verwenden, wenn der Codec dies unterstützt. Es gibt keinen öffentlichen Formatschlüssel, um die Anzahl der B-Frames zu steuern.

HDR in SDR mit dem Transformer-Modul transcodieren

Ab Android 13 (API-Level 33) empfehlen wir die Verwendung des Moduls Transformer von Jetpack Media3, um HDR-Inhalte für Apps, Dienste und Geräte freizugeben, die kein HDR unterstützen. Das Transformer-Modul ordnet einen HDR-Eingabe-Videostream dem SDR zu und speichert das Ergebnis im MP4-Format, was eine erfolgreiche Wiedergabe ohne Detail- oder Bildhelligkeitsverlust ermöglicht.

Hinweis: Auf Geräten, die auf Systemversionen von Android 12 (API-Level 32) bis Android 7.0 (API-Level 24) ausgerichtet sind, funktioniert das Transformer-Modul anders. Wenn das Gerät HDR unterstützt, gibt die App die Inhalte ohne Tonemapping wieder. Wenn das Gerät HDR nicht unterstützt, wird ein Fehler ausgegeben, der darauf hinweist, dass die HDR-Tonzuordnung nicht unterstützt wird.

Mit dem folgenden Code wird ein Transformer eingerichtet, der die Eingabe SDR zuordnet und im Eingabeformat (z. B. H.264/AVC) neu codiert:

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Informationen zum Testen der Tone-Mapping-Funktion finden Sie in der Transformer-Demo-App.

Sie können das Tone Mapping auch mit MediaCodec einrichten, allerdings ist die Implementierung komplexer. Weitere Informationen finden Sie in der Referenzdokumentation zu MediaCodec.