Transcodifica di contenuti multimediali compatibili

Su Android 12 (livello API 31) e versioni successive, il sistema può convertire automaticamente video registrati in formati come da HEVC (H.265) ad AVC (H.264) quando vengono aperti da un'app che non supporta HEVC. Questa funzionalità consente di usare acquisire app per utilizzare una codifica più moderna ed efficiente per i video registrati sul dispositivo senza sacrificare la compatibilità con altre app.

I seguenti formati possono essere transcodificati automaticamente per i contenuti creato sul dispositivo:

Formato multimediale Attributo XML Tipo MIME MediaFormat
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10+ MediaFeature.HdrType.HDR10_PLUS

Android presuppone che le app possano supportare la riproduzione di tutti i formati multimediali, quindi la transcodifica di contenuti multimediali compatibili è disattivata per impostazione predefinita.

Quando utilizzare la transcodifica

La transcodifica è un'operazione dispendiosa dal punto di vista del calcolo e aggiunge un significativo il ritardo nell'apertura di un file video. Ad esempio, un file video HEVC di un minuto circa 20 secondi per la transcodifica in AVC su uno smartphone Pixel 3. Per questo motivo, devi transcodificare un file video solo quando lo invii dispositivo. Ad esempio, quando condividi un file video con altri utenti o un server cloud che non supporta i video moderni formati.

Non eseguire la transcodifica quando apri file video per la riproduzione sul dispositivo o per creare immagini in miniatura.

Configurazione della transcodifica

Le app possono controllare il comportamento di transcodifica dichiarando i relativi contenuti multimediali le funzionalità di machine learning. Esistono due modi per dichiarare queste funzionalità: nel codice, o in una risorsa.

Dichiara le funzionalità nel codice

Puoi dichiarare le funzionalità multimediali nel codice costruendo un'istanza di un ApplicationMediaCapabilities oggetto utilizzando uno strumento di creazione:

Kotlin

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()

Java

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

Utilizza questo oggetto quando accedi ai contenuti multimediali con metodi come ContentResolver#openTypedAssetFileDescriptor():

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on values defined in the
        // ApplicationMediaCapabilities provided.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on values defined in the
    // ApplicationMediaCapabilities provided.
}

Questo metodo consente un controllo granulare per particolari percorsi del codice, come richiamando la transcodifica solo quando si trasferisce un file video al di fuori del dispositivo. Ha la precedenza sul metodo descritto di seguito.

Dichiarare le funzionalità in una risorsa

La dichiarazione di funzionalità in una risorsa consente un controllo generale sulla transcodifica. Questo metodo deve essere utilizzato solo in casi molto specifici. Ad esempio, se la tua app riceve file video solo da altre app (anziché aprirli direttamente) su un server che non supporta i codec video moderni (vedi (esempio di esempio 1 riportato di seguito).

L'utilizzo di questo metodo quando non è assolutamente necessario potrebbe richiamare la transcodifica in scenari indesiderati, come la miniatura di video, con un conseguente peggioramento dell'esperienza utente.

Per utilizzare questo metodo, crea un file di risorse media_capabilities.xml:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

In questo esempio, i video HDR registrati sul dispositivo vengono transcodificati senza problemi AVC SDR (Standard Dynamic Range), al contrario dei video HEVC.

Utilizza un tag property all'interno del tag application per aggiungere un riferimento ai contenuti multimediali delle funzionalità di machine learning. Aggiungi queste proprietà al file AndroidManifest.xml:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

Utilizzare le funzionalità multimediali di un'altra app per aprire un file video

Se la tua app condivide un file video con un'altra app, potrebbe essere necessario transcodificata prima che l'app ricevente possa aprirla.

Per gestire questa richiesta, apri un file video utilizzando openTypedAssetFileDescriptor e specificando l'UID dell'app ricevente, che può essere ottenuto utilizzando Binder.getCallingUid. La piattaforma utilizza quindi le funzionalità multimediali dell'app ricevente per determinare se il file video deve essere transcodificato.

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid())
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on the media capabilities of the
        // calling app.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid());
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on the media capabilities of the
    // calling app.
}

Scenari di esempio

I seguenti diagrammi mostrano i due casi d'uso comuni. In entrambi i casi, il video originale viene memorizzato in formato HEVC e l'app di condivisione video non che supportano HEVC.

Esempio 1. La transcodifica viene avviata dall'app di acquisizione video. Esempio 1 L'app di condivisione video dichiara di non supportare HEVC nei suoi contenuti multimediali di risorse di archiviazione di Google Cloud. Quindi, richiede un video dall'app di acquisizione video. L'acquisizione video L'app gestisce la richiesta e apre il file utilizzando openTypedAssetFileDescriptor, specificando l'UID dell'app di condivisione. Questa operazione avvia il processo di transcodifica. Una volta ricevuto, il video transcodificato viene fornito all'app di condivisione, che lo carica su un server nel cloud.

Esempio 2. La transcodifica viene avviata dall'app di condivisione video. Esempio 2 L'app di acquisizione video condivide un video con l'app di condivisione video utilizzando un URI MediaStore. L'app di condivisione video apre il file video utilizzando openTypedAssetFileDescriptor, specificando che non supporta HEVC nelle sue funzionalità multimediali. Questo il processo di transcodifica e, al termine, il file viene caricato un server nel cloud.

Formati non dichiarati

La transcodifica di contenuti multimediali compatibili è abilitata per tutti i formati dichiarati non è supportato ed è disabilitato per tutti i formati dichiarati supportati. Per o altri formati non dichiarati, la piattaforma decide se o meno. In Android 12 la transcodifica è disattivata per tutti i formati non dichiarati. Questo comportamento potrebbe cambiare per i nuovi formati nel per il futuro.

Opzioni sviluppatore

Puoi usare le seguenti opzioni sviluppatore per eseguire l'override delle impostazioni predefinite di Android comportamento di transcodifica:

  • Sostituisci i valori predefiniti per la transcodifica Questa impostazione determina se se la piattaforma controlla la transcodifica automatica. Quando sostituisci è abilitata, le impostazioni predefinite della piattaforma vengono ignorate e il pulsante attiva transcodifica automatica. Questa opzione è disattivata da predefinito.

  • Attiva transcodifica Questa impostazione specifica se non è stata dichiarata vengono transcodificati automaticamente. È abilitato per impostazione predefinita, ma ha effetto se è abilitata anche l'opzione Sostituisci i valori predefiniti di transcodifica.

  • Presupponi che le app supportino formati moderni Questa impostazione controlla cosa succede quando l'app prova a riprodurre un formato non dichiarato. Questo accade quando il manifest non dichiarare se l'app supporta o meno un determinato formato, oppure Google non ha aggiunto l'app all'elenco della transcodifica forzata lato server. Quando l'impostazione attiva, l'app non esegue la transcodifica, quando è disattivata, transcodificare. Questa opzione è abilitata per impostazione predefinita.

  • Mostra notifiche di transcodifica Quando questa opzione è attiva, l'app mostra una notifica di avanzamento della transcodifica quando la transcodifica viene attivata leggendo una file multimediale non supportato. Questa opzione è abilitata per impostazione predefinita.

  • Disattiva cache transcodifica Se questa opzione è attiva, le app che richiedono la transcodifica non lo richiedono utilizza la cache di transcodifica. Può essere utile durante lo sviluppo per semplificare attiva la transcodifica su un file multimediale non supportato, ma può causare un problema di qualità le prestazioni dei dispositivi. Questa opzione è disattivata per impostazione predefinita.