Di Android 12 (level API 31) dan yang lebih baru, sistem dapat otomatis mengonversi video yang direkam dalam format seperti HEVC (H.265) hingga AVC (H.264) saat video dibuka oleh aplikasi yang tidak mendukung HEVC. Dengan fitur ini, video dapat merekam aplikasi untuk memanfaatkan encoding video yang lebih modern dan hemat penyimpanan 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 |
HDR10 | HDR10 | 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.
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.
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. Waktu penggantian diaktifkan, setelan default platform akan diabaikan dan aktifkan setelan transcoding mengontrol transcoding otomatis. Opsi ini dinonaktifkan secara default.
Aktifkan transcoding Setelan ini menentukan apakah format yang tidak dideklarasikan perlu ditranscoding secara otomatis atau tidak. Ini diaktifkan secara {i>default<i}, 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.