Transcoding media yang kompatibel

Di Android 12 (API level 31) dan yang lebih tinggi, sistem dapat otomatis mengonversi video yang direkam dalam format seperti HEVC (H.265) ke AVC (H.264) saat video dibuka oleh aplikasi yang tidak mendukung HEVC. Fitur ini 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.

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.

Kapan harus menggunakan transcoding

Transcoding adalah operasi komputasi yang mahal dan menyebabkan penundaan yang signifikan saat membuka file video. Misalnya, file video HEVC selama satu menit memerlukan waktu sekitar 20 detik untuk di-transcoding ke AVC di ponsel Pixel 3. Karenanya, Anda harus men-transcoding file video hanya saat mengirimkannya dari perangkat. Misalnya, saat berbagi file video dengan pengguna lain dari aplikasi yang sama, atau server cloud yang tidak mendukung format video modern.

Jangan melakukan transcoding saat membuka file video untuk memutar di perangkat atau membuat gambar thumbnail.

Mengonfigurasi transcoding

Aplikasi dapat mengontrol perilaku transcoding dengan mendeklarasikan kemampuan medianya. Ada dua cara untuk mendeklarasikan kemampuan ini: dalam kode atau dalam sumber daya.

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 memungkinkan kontrol terperinci untuk jalur kode tertentu, seperti memanggil transcoding hanya saat mentransfer file video ke luar perangkat. Metode ini akan lebih diprioritaskan daripada metode yang dijelaskan di bawah.

Menyebutkan kemampuan dalam resource

Mendeklarasikan kemampuan dalam resource memungkinkan untuk mengontrol transcoding secara menyeluruh. Metode ini hanya boleh digunakan dalam kasus yang sangat spesifik. Misalnya, jika aplikasi Anda hanya menerima file video dari aplikasi lain (bukan membukanya secara langsung) dan menguploadnya ke server yang tidak mendukung codec video modern (lihat contoh skenario 1 di bawah).

Menggunakan metode ini jika tidak benar-benar diperlukan dapat mengaktifkan proses transcoding dalam skenario yang tidak diinginkan, seperti saat membuat thumbnail video, sehingga akan menurunkan pengalaman pengguna.

Untuk menggunakan metode ini, 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" />

Menggunakan kemampuan media aplikasi lain untuk membuka file video

Jika aplikasi Anda berbagi file video dengan aplikasi lain, file video mungkin perlu di-transcoding sebelum aplikasi penerima dapat membukanya.

Anda dapat menangani kasus ini dengan membuka file video menggunakan openTypedAssetFileDescriptor dan menentukan UID aplikasi penerima yang dapat diperoleh menggunakan Binder.getCallingUid. Platform kemudian menggunakan kemampuan media aplikasi penerima untuk menentukan apakah file video harus di-transcoding.

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.
}

Skenario contoh

Diagram berikut menunjukkan dua kasus penggunaan umum. Dalam kedua kasus tersebut, video asli disimpan dalam format HEVC dan aplikasi berbagi video tidak mendukung HEVC.

Contoh 1. Transcoding dimulai oleh aplikasi rekam video. Contoh 1 Aplikasi berbagi video mendeklarasikan tidak mendukung HEVC dalam file sumber daya kemampuan medianya. Kemudian aplikasi meminta video dari aplikasi rekam video. Aplikasi rekam video menangani permintaan dan membuka file menggunakan openTypedAssetFileDescriptor, yang menentukan UID aplikasi berbagi. Tindakan ini akan memulai proses transcoding. Ketika video yang ditranscoding diterima, video tersebut diberikan ke aplikasi berbagi yang menguploadnya ke server di cloud.

Contoh 2. Transcoding dimulai oleh aplikasi berbagi video. Contoh 2 Aplikasi rekam video membagikan video ke aplikasi berbagi video menggunakan URI MediaStore. Aplikasi berbagi video membuka file video menggunakan openTypedAssetFileDescriptor yang menentukan bahwa kemampuan media file tersebut tidak mendukung HEVC. Tindakan ini akan memulai proses transcoding, dan setelah selesai, file akan diupload ke server di cloud.

Format yang tidak dideklarasikan

Transcoding media yang kompatibel diaktifkan untuk semua format yang dideklarasikan tidak didukung, dan dinonaktifkan untuk semua format yang dideklarasikan didukung. Untuk format lain yang tidak dideklarasikan, platform akan memutuskan untuk men-transcoding atau tidak. Dalam Android 12, transcoding dinonaktifkan untuk semua format yang tidak dideklarasikan. Perilaku ini mungkin berubah untuk format baru selanjutnya.

Opsi developer

Anda dapat menggunakan opsi developer berikut untuk mengganti perilaku transcoding default Android:

  • Ganti default transcoding Setelan ini menentukan apakah platform mengontrol transcoding otomatis atau tidak. Jika penggantian diaktifkan, setelan default platform akan diabaikan dan setelan aktifkan transcoding akan mengontrol transcoding otomatis. Opsi ini dinonaktifkan secara default.

  • Aktifkan transcoding Setelan ini menentukan apakah format yang tidak dideklarasikan perlu ditranscoding secara otomatis atau tidak. Fitur ini diaktifkan secara default, tetapi hanya berpengaruh jika ganti default transcoding juga diaktifkan.

  • Asumsikan aplikasi mendukung format modern Setelan ini mengontrol tindakan yang terjadi saat aplikasi mencoba memutar format yang tidak dideklarasikan. Hal ini terjadi jika manifes tidak menyatakan apakah aplikasi mendukung format tertentu atau tidak, atau Google belum menambahkan aplikasi ke daftar transcoding paksa sisi server. Saat setelan diaktifkan, aplikasi tidak melakukan transcoding, dan jika dinonaktifkan, aplikasi akan melakukan transcoding. Opsi ini diaktifkan secara default.

  • Tampilkan notifikasi transcoding Jika diaktifkan, aplikasi akan menampilkan notifikasi progres transcoding saat transcoding dipicu dengan membaca file media yang tidak didukung. Opsi ini diaktifkan secara default.

  • Nonaktifkan cache transcoding Jika diaktifkan, aplikasi yang memerlukan transcoding tidak menggunakan cache transcoding. Hal ini dapat berguna selama pengembangan untuk memicu transcoding dengan mudah pada file media yang tidak didukung, tetapi dapat menyebabkan performa perangkat yang buruk. Opsi ini dinonaktifkan secara default.