Best practice per la condivisione di video

Molte persone condividono i video utilizzando i dispositivi Android. La qualità dei contenuti ricevuti è spesso inferiore all'originale a causa dell'elaborazione eseguita dall'app di condivisione. Questo documento descrive come ottimizzare la qualità ha condiviso dei video ed evita alcuni insidie comuni nell'elaborazione dei video. Per ottimizzare per la condivisione di contenuti video HDR, consulta Utilizza il modulo Transformer per transcodificare HDR in SDR in questa pagina.

L'importante è mantenere una risoluzione costante e la qualità video il più in alto possibile, il più a lungo possibile durante la preparazione alla condivisione di un video.

La pipeline di condivisione

La Figura 1 illustra un flusso tipico per la condivisione di un video:

Condivisione della pipeline video in corso... Figura 1. La pipeline di condivisione di video.

La pipeline include questi passaggi:

  1. Acquisisci e codifica un video, aggiungendo eventualmente effetti durante l'acquisizione. In alternativa, l'utente può saltare questo passaggio e selezionare un video dallo spazio di archiviazione che è stato preregistrato da un'altra app.
  2. Modificare, filtrare, ritoccare o elaborare in altro modo il video.
  3. Scala o ridimensiona il video in preparazione per la transcodifica.
  4. Transcodifica il video per la condivisione. Il filtro nel passaggio 2 viene spesso applicato come in questo passaggio.

Ci sono due passaggi nella pipeline in cui hai la possibilità di impostare parametri che determinano la qualità del video: la codifica durante il processo iniziale registrazione e transcodifica prima della condivisione. Inoltre, potrebbe essere necessario riscalare il video prima del passaggio di transcodifica finale, il che può influire anche sulla qualità.

Consigli

La tabella 1 mostra i cinque parametri principali per la qualità video e indica quali passaggi possono utilizzarli.

Parametro Acquisisci Condividi
Profilo Y Y
Risoluzione Y Y
Velocità in bit Y Y
Parametro di quantizzazione (QP) (raramente) Y
B frame N Y

Tabella 1. Parametri principali che determinano la qualità video

Profilo

Per ottenere risultati migliori, utilizza i profili più avanzati forniti dalla codec. Per la codifica AVC, seleziona Profilo alto e livello 4.

Risoluzione, ritaglio e ridimensionamento

Puoi modificare la risoluzione iniziale del video acquisito nell'apposito passaggio di ridimensionamento. prima della transcodifica per la condivisione, ma la scalabilità può ridurre la qualità video. Ti consigliamo di evitare la scalabilità e di selezionare una risoluzione per la configurazione iniziale che puoi usare in tutta la pipeline. Ricorda inoltre che l'estrema il ritaglio produce un'immagine di bassa qualità, soprattutto se ridimensiona l'immagine ritagliata dell'immagine. Segui queste linee guida:

  • Scegli una risoluzione almeno pari a quella finale della condivisione.
  • La risoluzione di acquisizione non deve superare di molto la risoluzione di condivisione a meno che tutti i passaggi intermedi non siano progettati per supportare la più ampia (ad esempio, la maggiore velocità in bit durante l'acquisizione iniziale).

    • Se la codifica di condivisione produce una risoluzione di 720 x 1280, consigliamo una Risoluzione di acquisizione 720 x 1280.
    • Se i passaggi intermedi tra l'acquisizione e la condivisione includono il ritaglio, utilizza una risoluzione di acquisizione più alta, ad esempio 1080 x 1920, e aumenta di acquisizione della velocità in bit per gestire i pixel aggiuntivi.
  • Il ritaglio estremo comporta un'immagine di bassa qualità, soprattutto se il ritaglio viene migliorata l'immagine.

  • Evita di passare dalla risoluzione più bassa a una più alta. Tentativi di upscaling per creare dettagli che non sono presenti. Usa la risoluzione che preferisci dall'inizio.

  • Se è necessario eseguire l'upscaling, regola i parametri di codifica. Ad esempio, se una risoluzione elevata ha il doppio dei pixel, il doppio della velocità in bit.

Risoluzione e velocità in bit sono correlate tra loro. Ad esempio, trasmettere un video ad alta risoluzione tramite una pipeline di condivisione che si transcodifica con una bassa velocità in bit produce un'immagine di qualità inferiore rispetto a quando inizi con una risoluzione più bassa. Come la velocità in bit diminuisce, ci sono punti di crossover in cui iniziano le risoluzioni più piccole per ottenere risultati migliori:

Velocità in bit Risoluzione
5 Mbps o più 1080x1920
1,5 - 5+ Mbps 720x1280
1,5 Mbps o meno equivalente SD. Lo stesso numero di pixel nelle proporzioni 9:16 è di circa 416 x 736

Tabella 2. Velocità in bit e risoluzione

Molte app popolari condividono video a una risoluzione di 720p o inferiore. I dati indicano La risoluzione di 720p è una scelta appropriata per i target con velocità in bit comprese tra 1,5 e 5 Mbps.

Velocità in bit

Registrazione in corso…

L'utilizzo di una velocità in bit di codifica più elevata offre il massimo miglioramento nei video qualità. Consigliamo di scegliere velocità in bit che corrispondano alle app native della fotocamera. Per un Risoluzione 720 x 1280, consigliamo una velocità in bit di acquisizione di 10 Mbps.

Poiché la codifica di acquisizione viene eseguita sul dispositivo, puoi utilizzare una velocità in bit più elevata compensare la maggior parte delle trasformazioni dei passaggi di condivisione con piccoli impatto. I file risultanti di dimensioni maggiori vengono utilizzati solo per la manipolazione sul dispositivo.

Puoi ridurre la velocità in bit al passaggio di transcodifica finale, come illustrato nella tabella 2.

Condivisione

La velocità in bit ha l'impatto maggiore al momento della condivisione, in quanto è direttamente correlata le dimensioni del video che verrà caricato. C'è un compromesso tra i video qualità, tempo di trasmissione dei file e costi di archiviazione sul cloud.

Anche la scelta del profilo di codifica, dei B-frame e dei valori di delimitazione QP è maggiore in questa fase che in fase di acquisizione.

Consigliamo una velocità in bit compresa tra 4 e 5 Mbps (per una risoluzione 720 x 1280) per garantire una buona connessione la qualità visiva.

Parametro di quantizzazione (QP)

Su Android 12 e versioni successive, le chiavi QP sono standardizzate e sono disponibili in MediaFormat API e nel Raccolta multimediale NDK: Nelle versioni precedenti di Android, la manipolazione del QP è disponibile solo tramite il framework utilizzando chiavi specifiche del fornitore nella configurazione di MediaFormat.

Registrazione in corso…

Durante l'acquisizione del video, usate il controllo della velocità in bit anziché le impostazioni QP, che sono non sempre disponibili.

Sconsigliamo di modificare le impostazioni QP per la velocità in bit di acquisizione di 10 Mbps. (per 720 x 1280). Se la velocità in bit di acquisizione è notevolmente inferiore, inferiore a 5 Mbps per 720 x 1280; un'impostazione QP di 40 rappresenta un buon compromesso tra una maggiore qualità senza costringere il codec a superare troppo spesso la velocità in bit target.

Condivisione

Consigliamo un limite massimo di QP pari a 40, soprattutto quando la velocità in bit è inferiore a 4 Mbps. Anche se questo garantisce una qualità minima per i video codificati, può produrre un con una velocità in bit più alta. L'aumento della velocità in bit dipende la complessità del video. Sebbene un'app di condivisione possa tollerare alcune variazioni del velocità in bit del video generato, potrebbe non tollerare un aumento oltre una una certa soglia.

Puoi limitare l'aumento della velocità in bit ricodificando il video per la condivisione con un limite massimo meno restrittivo (superiore). In questo modo il codec ha maggiore libertà sacrificare la qualità e preservare altre parti del video. Puoi ricodificare video per la condivisione in quanto è un'operazione di transcodifica; hai già e registrato il video che intendi condividere.

Lo svantaggio è che ripetere il passaggio di transcodifica con questi aumenta il tempo necessario per condividere il video. Un modo per ridurre questa latenza nell'esaminare il video parzialmente transcodificato per decidere se entro la tua tolleranza per il superamento della velocità in bit. In caso contrario, puoi interrompere transcodifica e riprovare con parametri QP più appropriati.

B-frame e profili di codifica

Prendi in considerazione l'utilizzo di B-frame solo durante la fase di condivisione e solo durante l'esecuzione Android 10 o versioni successive.

Le app devono controllare i profili di codifica supportati utilizzando CodecCapabilities, poiché non tutti i dispositivi supportano i profili principali o di alto livello. Usa il profilo più alto supportato dal codificatore AVC: High > Principale > Base di riferimento. Per risultati più sicuri, non configurare i B-frame (KEY_LATENCY o KEY_MAX_B_FRAMES) quando si utilizza il valore di riferimento poiché alcuni encoder potrebbero non riuscire a eseguire la configurazione.

I seguenti segmenti di codice presuppongono un valore 'MediaFormat format' che verrà utilizzato per configura l'encoder AVC

Android 10

API 29 o successiva

Usa il profilo più alto supportato e imposta il parametro B-frame su 1:

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

Non impostare KEY_LATENCY in questa situazione.

Android 8, 8.1 e 9

API 26, 27, 28

Utilizza il profilo più supportato, ma disattiva la generazione di B-frame. Questo presenta alcune limitazioni MediaMuxer in queste versioni di sistema

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

Il valore KEY_LATENCY impedisce ai codec di generare B-frame, ma sfrutta altre efficienze del codec.

Se la tua app non utilizza MediaMuxer per assemblare il file di output finale, puoi abilita i B-frame impostando il valore di KEY_LATENCY su 2 anziché su 1. Questa operazione dovrebbe consentire al codec di produrre fotogrammi B.

Android 7.1 e versioni precedenti

API 25 e precedenti

Utilizza il profilo di riferimento per ottenere risultati più sicuri.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Prima della versione 7, Android AOSP supporta solo il profilo di base. Tuttavia, è probabile che gli OEM abbiano abilitato un profilo principale/alto su alcuni dispositivi, ad esempio utilizzando un profilo specifico del fornitore.

Se la tua app non usa MediaMuxer, puoi usare il profilo principale o di alto livello quando il codec la supporta. Non esiste una chiave di formato pubblica per controllare il numero di coppie B- i frame.

Utilizzare il modulo Transformer per convertire la tecnologia HDR in SDR

A partire da Android 13 (livello API 33), ti consigliamo di usare Trasformatore per condividere i contenuti HDR con app, servizi e dispositivi che non supportano HDR. Il modulo Transformer funziona mediante la mappatura dei toni lo stream video HDR in SDR e il salvataggio del risultato come MP4, il che consente una riproduzione senza perdita di dettagli o luminosità dell'immagine.

Nota: sui dispositivi che hanno come target versioni di sistema comprese tra Android 12 (livello API 32) fino ad Android 7.0 (livello API 24), il modulo Transformer funziona in modo diverso. Se Se il dispositivo supporta la tecnologia HDR, l'app riproduce i contenuti senza mappatura dei toni. Se il dispositivo non supporta HDR, viene visualizzato un errore che indica che HDR la mappatura dei toni non è supportata.

Il codice seguente configura un Transformer che il tono mappa l'input a SDR e la ricodifica nel formato di input (ad esempio 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();

Per provare la funzionalità di mappatura dei toni, vedi App demo di Transformer.

Puoi anche configurare la mappatura dei toni utilizzando MediaCodec, anche se l'implementazione è più complessa. Per ulteriori informazioni, consulta documentazione di riferimento di MediaCodec.