Viele Nutzer teilen Videos über ihr Android-Gerät. Die Qualität der empfangenen ist das Video aufgrund der durchgeführten Verarbeitung häufig schlechter als das Original. durch die Freigabe-App. In diesem Dokument wird beschrieben, wie Sie die Qualität geteilte Videos und einige häufige Fehler bei der Videoverarbeitung. Zum Optimieren zum Teilen von HDR-Videos findest du unter Verwenden Sie das Transformer-Modul, um HDR in SDR zu transcodieren auf dieser Seite.
Wichtig ist, dass du eine konstante Auflösung und die Videoqualität so lange wie möglich so hoch wie möglich sein.
Freigabepipeline
Abbildung 1 zeigt einen typischen Ablauf für die Freigabe eines Videos:
Die Pipeline umfasst folgende Schritte:
- Nehmen Sie ein Video auf und codieren Sie es und fügen Sie dabei möglicherweise Effekte hinzu. Der Nutzer kann diesen Schritt auch überspringen und ein Video aus dem Speicher auswählen. die zuvor mit einer anderen App aufgenommen wurde.
- Du kannst das Video bearbeiten, filtern, retuschieren oder anderweitig verarbeiten.
- Zur Vorbereitung auf die Transcodierung das Video skalieren oder vergrößern/verkleinern.
- Transcodieren Sie das Video zum Teilen. Die Filterung in Schritt 2 wird häufig Teil dieses Schritts.
In der Pipeline gibt es zwei Schritte, in denen Sie Parameter, die die Qualität deines Videos bestimmen: die Codierung während der der Aufzeichnung und der Transcodierung. Außerdem müssen Sie möglicherweise Skalieren Sie das Video vor dem letzten Transcodierungsschritt neu, was sich ebenfalls auf die Qualität auswirken kann.
Empfehlungen
In Tabelle 1 sind die fünf Hauptparameter für die Videoqualität aufgeführt. gibt an, für welche Schritte sie verwendet werden können.
Parameter | Aufnehmen | Teilen |
Profil | J | J |
Lösung | J | J |
Bitrate | J | J |
Quantisierungsparameter (QP) | (selten) | J |
B-Frames | N | J |
Profil
Bessere Ergebnisse erzielen Sie, wenn Sie die erweiterten Profile der jeweiligen Codec. Wählen Sie für die AVC-Codierung Hohes Profil und Level 4 aus.
Auflösung, Zuschneiden und Skalierung
Sie können die anfängliche Auflösung des aufgenommenen Videos im Skalierungsschritt ändern. vor der Transcodierung für die Freigabe vor. Die Skalierung kann jedoch die Qualität des Video. Wir empfehlen, eine Skalierung zu vermeiden und eine Auflösung für die anfängliche Codierung, die Sie in der gesamten Pipeline verwenden können. Denken Sie auch an die extremen das Zuschneiden zu einer schlechten Bildqualität führt, insbesondere wenn Sie die Größe des zugeschnittenen Bild. Beachten Sie die folgenden Richtlinien:
- Die Auflösung muss mindestens so groß sein wie die endgültige Auflösung beim Teilen.
Die Auflösung für die Aufnahme sollte die Auflösung beim Teilen nicht erheblich übersteigen. es sei denn, die Zwischenschritte sind darauf ausgelegt, die größeren (z. B. eine höhere Bitrate bei der ersten Aufnahme).
- Ergibt die gemeinsame Codierung eine Auflösung von 720 x 1280, empfehlen wir eine Aufnahmeauflösung: 720 x 1280
- Wenn die Zwischenschritte zwischen der Aufnahme und dem Teilen das Zuschneiden umfassen, verwenden Sie eine höhere Aufnahmeauflösung (z. B. 1080 x 1920) und Bitrate erfassen, um die zusätzlichen Pixel zu verarbeiten.
Ein extremer Zuschnitt führt zu einer schlechten Bildqualität, insbesondere wenn das zugeschnittene Bild Bild wird hochskaliert.
Vermeiden Sie das Hochskalieren von einer niedrigeren auf eine höhere Auflösung. Versuche zum Vergrößern um Details zu erzeugen, die nicht vorhanden sind. Die gewünschte höhere Auflösung übernehmen von Anfang an dabei.
Wenn Sie hochskalieren müssen, passen Sie die Codierungsparameter an. Wenn zum Beispiel der Parameter höhere Auflösung hat doppelt so viele Pixel und die doppelte Bitrate.
Auflösung und Bitrate sind miteinander verknüpft. Eine hochauflösende Anzeige das Video über eine Freigabepipeline verarbeitet, die schließlich auf eine niedrige Bitrate transcodiert. erzeugt eine geringere Qualität als das Starten mit einer niedrigeren Auflösung. Da die die Bitrate abnimmt, gibt es Übergangspunkte, an denen kleinere Auflösungen um bessere Ergebnisse zu erzielen:
Bitrate | Lösung |
Mind. 5 Mbit/s | 1080 × 1920 |
1,5–5+ Mbit/s | 720 × 1280 |
Maximal 1,5 Mbit/s | SD-Äquivalent. Dieselbe Pixelzahl bei einem Seitenverhältnis von 9:16 beträgt etwa 416 x 736. |
Viele beliebte Apps teilen Videos mit einer Auflösung von maximal 720p. Die Daten zeigen, dass eine Auflösung von 720p eine geeignete Wahl für Bitratenziele zwischen 1,5 und 5 Mbit/s.
Bitrate
Aufnahme läuft
Die Verwendung einer höheren Codierungs-Bitrate bietet die größte Verbesserung bei Videos. die Qualität zu verbessern. Wir empfehlen, Bitraten auszuwählen, die den nativen Kamera-Apps entsprechen. Für eine einer Auflösung von 720 x 1280. Wir empfehlen eine Aufnahmebitrate von 10 Mbit/s.
Da die Codierung der Aufnahme auf dem Gerät erfolgt, kannst du eine höhere Bitrate verwenden, kompensieren Sie die meisten Anpassungen des Freigabeschritts mit wenig negativen die Auswirkungen. Die größeren resultierenden Dateien werden nur zur Manipulation auf dem Gerät verwendet.
Sie können die Bitrate im letzten Transcodierungsschritt reduzieren, wie in Tabelle 2 dargestellt.
Inhalte teilen
Die Bitrate hat zum Zeitpunkt der Freigabe die größte Wirkung, da sie sich direkt auf die Größe des Videos, das hochgeladen wird. Es gibt einen Kompromiss zwischen Qualität, Dateiübertragungszeit und Cloud-Speicherkosten.
Die Wahl des Codierungsprofils, der B-Frames und der QP-Begrenzungswerte wichtiger als bei der Aufnahme.
Wir empfehlen eine Bitrate zwischen 4 und 5 Mbit/s (für eine Auflösung von 720 x 1280), um eine gute und Bildqualität.
Quantisierungsparameter (QP)
Unter Android 12 und höher sind die QP-Schlüssel standardisiert und in der
MediaFormat
API und in der
NDK Media Library.
Bei früheren Android-Versionen ist die QP-Bearbeitung nur über das Framework möglich.
Funktionen mit anbieterspezifischen Schlüsseln in der MediaFormat
-Konfiguration.
Aufnahme läuft
Verwenden Sie während der Videoaufnahme statt der QP-Einstellungen die Option zur Bitrate. nicht immer verfügbar.
Wir raten davon ab, die QP-Einstellungen für Erfassungsbitraten von 10 Mbit/s anzupassen. (für 720 x 1280). Wenn die Bitrate für die Erfassung erheblich niedriger ist, unter 5 Mbit/s für 720 x 1280 und eine QP-Einstellung von 40 ist ein guter Kompromiss zwischen 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. Dadurch wird zwar eine Mindestqualität für die codierten Videos sichergestellt, aber es kann eine mit einer höheren Bitrate. Die Erhöhung der Bitrate hängt davon ab, die Komplexität des Videos. Auch wenn eine Freigabe-App eine gewisse Abweichung in der der generierten Videobitrate, wird eine Erhöhung möglicherweise nicht toleriert, die über einen bestimmten Grenzwert zu erreichen.
Du kannst die Erhöhung der Bitrate begrenzen, indem du das Video für das Teilen mit einem weniger restriktive (höhere) maximale QP-Grenze. Dadurch hat der Codec mehr Freiheiten, auf Qualität verzichten und andere Teile des Videos beibehalten. Sie können den Code da es sich um einen Transkodierungsvorgang handelt. haben Sie bereits das Video aufgenommen, das Sie teilen möchten.
Der Nachteil ist, dass die Wiederholung des Transcodierungsschritts mit diesen unterschiedlichen wird das Video länger geteilt. Eine Möglichkeit, die sich das teilweise transcodierte Video anzusehen, um zu entscheiden, ob es nicht innerhalb der Toleranz für eine Überschreitung der Bitrate. Ist dies nicht der Fall, können Sie und versuchen Sie es noch einmal mit passenderen QP-Parametern.
B-Frames und Codierungsprofile
Verwenden Sie B-Frames nur während des Teilens und nur beim Ausführen Android 10 oder höher.
Apps sollten die unterstützten Codierungsprofile mit
CodecCapabilities
,
da nicht alle Geräte ein Haupt- oder ein hohes Profil unterstützen. Höchstes Profil verwenden
unterstützt vom AVC-Encoder: High > Hauptseite > Baseline. Um sicherste Ergebnisse zu erhalten,
B-Frames konfigurieren
(KEY_LATENCY
oder
KEY_MAX_B_FRAMES
)
bei Verwendung des Baseline-Werts
da einige Encoder möglicherweise nicht konfiguriert werden.
Bei den folgenden Codesegmenten wird von einer 'MediaFormat format'
ausgegangen, die für
AVC-Encoder konfigurieren
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
Das am höchsten unterstützte Profil verwenden, aber die Generierung von B-Frames deaktivieren. Dieses
berücksichtigt einige Einschränkungen der
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, aber trotzdem
nutzt andere Codec-Effizienz.
Wenn deine App MediaMuxer
nicht zum Zusammenstellen der endgültigen Ausgabedatei verwendet, kannst du Folgendes tun:
aktivieren Sie B-Frames, indem Sie den Wert KEY_LATENCY
auf 2 statt auf 1 setzen. Dies sollte
damit der Codec B-Frames erzeugen kann.
Android 7.1 und niedriger
API 25 und frühere Versionen
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. Allerdings ist es wahrscheinlich, dass OEMs auf einigen Geräten eine Haupt-/Hochprofilfunktion aktiviert haben, z. B. mit einem anbieterspezifischen Profil.
Wenn deine App MediaMuxer
nicht verwendet, kannst du das Haupt- oder das Profil „High“ verwenden, wenn
der Codec es unterstützt. Es gibt keinen öffentlichen Formatschlüssel, um die Anzahl der B-
Frames.
HDR mit dem Transformer-Modul in SDR transcodieren
Ab Android 13 (API-Level 33) empfehlen wir die Verwendung des Transformator um HDR-Inhalte mit Apps, Diensten und Geräten zu teilen, HDR unterstützen. Beim Transformer-Modul werden Tonzuordnungen HDR-Videostreaming in SDR und das Ergebnis als MP4-Datei speichern, wodurch reibungslos ohne Detailverlust oder Bildhelligkeit wiedergeben.
Hinweis: Auf Geräten, die auf Systemversionen zwischen Android 12 (API-Level 32) ausgerichtet sind bis Android 7.0 (API-Ebene 24) funktioniert das Transformer-Modul anders. Wenn unterstützt das Gerät HDR, spielt die App die Inhalte ohne Tone-Mapping ab. Wenn das Gerät HDR nicht unterstützt, wird eine Fehlermeldung ausgegeben, dass HDR Tone-Mapping wird nicht unterstützt.
Mit dem folgenden Code wird ein Transformer eingerichtet, der die Eingabe codiert ihn im Eingabeformat neu (z. B. H.264/AVC):
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();
Wenn Sie die Tone Mapping-Funktion ausprobieren möchten, sehen Sie sich die Transformer-Demo-App
Sie können das Tone Mapping auch mit
MediaCodec
, obwohl die Implementierung
ist komplexer. Weitere Informationen finden Sie in der
Referenzdokumentation zu MediaCodec