Selamat datang di Pratinjau Developer Android 12. Beri kami masukan lebih awal dan sering, serta bantu kami menjadikan Android 12 sebagai rilis terbaik!

Transcoding media yang kompatibel

Berikan ikon masukan Kami ingin mendengar masukan dari Anda terkait transcoding media yang kompatibel. Ikuti survei singkat untuk menyampaikan opini Anda. Secara khusus, beri tahu kami kasus penggunaan di aplikasi Anda yang terpengaruh oleh perubahan ini.

Android 12 memperkenalkan fitur baru yang memungkinkan aplikasi perekaman video menggunakan encoding yang efisien dalam hal penyimpanan dan lebih modern untuk video yang direkam di perangkat tanpa mengorbankan kompatibilitas dengan aplikasi lain.

Android dapat secara otomatis mengonversi video yang direkam dalam format seperti HEVC (H.265) ke AVC (H.264) saat video itu dibuka oleh aplikasi yang tidak mendukung format HEVC.

Format berikut dapat di-transcoding secara otomatis untuk konten yang dibuat di perangkat:

Format media Atribut XML Jenis mime MediaFormat
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android menganggap aplikasi dapat mendukung pemutaran semua format media sehingga transcoding media yang kompatibel dinonaktifkan secara default. Aplikasi yang ingin meminta media di-transcoding ke format yang lebih kompatibel harus menyatakan kemampuan medianya. Ada dua cara untuk menyatakan kemampuan ini, yaitu dalam resource atau inline dalam kode.

Menyebutkan kemampuan dalam resource

Pertama, buat file resource 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>

Dalam contoh ini, video HDR yang direkam pada perangkat di-transcoding dengan lancar ke video AVC SDR (rentang dinamis standar), sedangkan video HEVC tidak.

Gunakan tag property dalam tag application untuk menambahkan referensi ke file kemampuan media. Tambahkan properti ini ke file AndroidManifest.xml Anda:

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

Menyebutkan kemampuan dalam kode

Anda dapat menyebutkan kemampuan media dalam kode dengan membuat instance objek ApplicationMediaCapabilities menggunakan builder:

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();

Gunakan objek ini saat mengakses konten media melalui metode seperti 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.
}

Metode ini lebih diprioritaskan dibandingkan dengan kemampuan yang ditautkan dalam AndroidManifest.xml aplikasi sehingga memungkinkan kontrol untuk jalur kode tertentu, seperti melakukan pengujian A/B, menjadi lebih terperinci.