Best practice per la condivisione di video

Molte persone condividono i video utilizzando il proprio dispositivo Android. La qualità del video ricevuto è spesso inferiore a quella dell'originale a causa dell'elaborazione eseguita dall'app di condivisione. Questo documento descrive come ottimizzare la qualità dei video condivisi e alcuni errori comuni relativi all'elaborazione dei video da evitare. Per eseguire l'ottimizzazione ai fini della condivisione di contenuti video HDR, consulta Utilizzare il modulo Transformer per transcodificare l'HDR in SDR in questa pagina.

La cosa principale da fare è mantenere una risoluzione costante e mantenere la qualità video il più alta possibile per tutto il tempo possibile mentre ti prepari a condividere un video.

La pipeline di condivisione

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

Condivisione pipeline video Figura 1. La pipeline di condivisione di video.

La pipeline include i seguenti passaggi:

  1. Acquisisci e codifica un video, possibilmente aggiungendo 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. Modifica, filtra, ritocca o elabora in altro modo il video.
  3. Ridimensiona il video o ridimensionalo in preparazione per la transcodifica.
  4. Transcodifica il video per la condivisione. Il filtro nel passaggio 2 viene spesso applicato in questo passaggio.

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

Contenuti consigliati

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

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

Tabella 1. Parametri principali che determinano la qualità video

Profilo

Per ottenere risultati migliori, usa i profili più avanzati forniti da quel particolare codec. Per la codifica AVC, seleziona Alto profilo e livello 4.

Risoluzione, ritaglio e ridimensionamento

Puoi modificare la risoluzione iniziale del video acquisito nella fase di scalabilità prima della transcodifica per la condivisione, ma la scalabilità può ridurre la qualità del video. Ti consigliamo di evitare la scalabilità e di selezionare una risoluzione per la codifica iniziale che puoi utilizzare in tutta la pipeline. Ricorda inoltre che un taglio estremo produce un'immagine di bassa qualità, soprattutto se aumenti l'immagine ritagliata. Segui queste linee guida:

  • Scegli una risoluzione che corrisponda almeno a quella della risoluzione finale della condivisione.
  • La risoluzione di acquisizione non deve superare di gran lunga quella di condivisione, a meno che tutti i passaggi intermedi non siano progettati per supportare una risoluzione maggiore (ad esempio una 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 di 720 x 1280.
    • Se i passaggi intermedi tra l'acquisizione e la condivisione includono il ritaglio, utilizza una risoluzione di acquisizione più elevata, ad esempio 1080 x 1920, e aumenta la velocità in bit dell'acquisizione per gestire i pixel aggiuntivi.
  • Il ritaglio estremo produce un'immagine di bassa qualità, soprattutto se l'immagine ritagliata viene ridimensionata.

  • Evita l'upscaling da una risoluzione più bassa a una più alta. L'upscaling cerca di creare dettagli che non sono presenti. Utilizza fin dall'inizio la risoluzione più alta desiderata.

  • Se devi fare lo scale up, regola i parametri di codifica. Ad esempio, se la risoluzione migliorata ha il doppio dei pixel, raddoppia la velocità in bit.

Risoluzione e velocità in bit sono correlate. Ad esempio, trasmettere un video ad alta risoluzione attraverso una pipeline di condivisione che esegue la transcodifica a una bassa velocità in bit produce un'immagine di qualità inferiore rispetto a quella iniziale con una risoluzione più bassa. Man mano che la velocità in bit diminuisce, ci sono punti di crossover in cui risoluzioni più piccole iniziano a produrre risultati migliori:

Velocità in bit Risoluzione
5+ Mbps 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 con una risoluzione massima di 720p. I dati indicano che la risoluzione 720p è la scelta appropriata per target di velocità in bit comprese tra 1,5 e 5 Mbps.

Velocità in bit

Registrazione in corso…

L'utilizzo di una maggiore velocità in bit della codifica offre il maggiore miglioramento della qualità video. Ti consigliamo di scegliere velocità in bit che corrispondono alle app native della fotocamera. Per una 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 maggiore per compensare la maggior parte delle trasformazioni dei passaggi di condivisione con un impatto negativo minimo. I file risultanti di dimensioni maggiori vengono utilizzati solo per la manipolazione sul dispositivo.

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

Condivisione

La velocità in bit ha l'impatto maggiore al momento della condivisione perché è direttamente correlata alle dimensioni del video che verrà caricato. Esiste un compromesso tra qualità video, 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 è più importante in questa fase che durante l'acquisizione.

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

Parametro di quantizzazione (QP)

Su Android 12 e versioni successive, le chiavi QP sono standardizzate e sono disponibili nell'API MediaFormat e nella NDK Media Library. Nelle versioni precedenti di Android, la manipolazione del QP è disponibile solo tramite le funzioni del framework che utilizzano chiavi specifiche del fornitore nella configurazione di MediaFormat.

Registrazione in corso…

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

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

Condivisione

Consigliamo un limite QP massimo di 40, soprattutto quando la velocità in bit è inferiore a 4 Mbps. Sebbene questo garantisca una qualità minima per i video codificati, può produrre un risultato con una velocità in bit maggiore. L'aumento della velocità in bit dipende dalla complessità del video. Sebbene un'app di condivisione possa tollerare una certa varianza nella velocità in bit del video generato, potrebbe non tollerare un aumento oltre una determinata soglia.

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

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

B-frame e profili di codifica

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

Le app dovrebbero controllare i profili di codifica supportati utilizzando CodecCapabilities, poiché non tutti i dispositivi supportano i profili principale o alto. Utilizza il profilo più alto supportato dal codificatore AVC: Alto > Principale > Base di riferimento. Per ottenere risultati più sicuri, non configurare i frame B (KEY_LATENCY o KEY_MAX_B_FRAMES) quando utilizzi il profilo di riferimento, in quanto alcuni codificatori potrebbero non riuscire a configurare.

I seguenti segmenti di codice presuppongono un valore 'MediaFormat format' che verrà utilizzato per configurare il codificatore AVC

Android 10

API 29 o versioni successive

Utilizza 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. Ciò presenta alcune limitazioni di 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 frame B, ma sfrutta comunque altre efficienze del codec.

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

Android 7.1 e versioni precedenti

API 25 e versioni 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 riferimento. Tuttavia, è probabile che gli OEM abbiano abilitato un profilo principale/di alto su alcuni dispositivi, magari utilizzando un profilo specifico del fornitore.

Se la tua app non utilizza MediaMuxer, puoi utilizzare il profilo principale o alto quando il codec lo supporta. Non esiste una chiave di formato pubblica per controllare il numero di frame B.

Usa il modulo Transformer per transcodificare l'HDR in SDR

A partire da Android 13 (livello API 33), ti consigliamo di utilizzare il modulo Transformer di Jetpack Media3 per condividere contenuti HDR con app, servizi e dispositivi che non supportano l'HDR. Il modulo Transformer esegue la mappatura tonale di uno stream video HDR di input in SDR e salva il risultato come MP4, in modo da consentire la riproduzione senza perdita di dettagli o luminosità dell'immagine.

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

Il codice seguente configura un Transformer che mappa il tono all'input in SDR e lo 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 tonale, vai all'app demo Transformer.

Puoi anche configurare la mappatura tonale utilizzando MediaCodec, sebbene l'implementazione sia più complessa. Per ulteriori informazioni, consulta la documentazione di riferimento di MediaCodec.