Anda dapat memperluas komponen ekstraktor media dan codec media menggunakan ekstensi
vendor. MediaSession2 dan MediaParser API tidak dapat disesuaikan (tetapi Anda dapat melakukan perubahan upstream untuk API MediaPlayer
dan MediaSession
yang lama).
Untuk mendukung jenis media tambahan dalam framework media Android, Anda perlu membuat ekstraktor dan decoder kustom. Misalnya, guna menambahkan dukungan bagi video Windows Media dalam file AVI, Anda perlu membuat Extractor AVI dan Decoder video Windows Media.
Tentang ekstensi
Jika ekstraktor media default tidak memenuhi persyaratan, Anda dapat menempatkan
plugin ekstraktor kustom di /system/lib[64]/extractors/
. Proses ekstraktor
secara otomatis memuat plugin ekstraktor dari paket APEX yang disediakan Google dan
dari /system/lib[64]/extractors/
.
Demikian pula, Anda dapat menyiapkan layanan codec media kustom yang menggunakan antarmuka
Codec 2.0 yang ditentukan di frameworks/av/media/codec2/core/
. Untuk implementasi
dasar, lihat frameworks/av/media/codec2/hidl/services/
. Titik
entri library adalah antarmuka C2ComponentStore
. Sebagai contoh, lihat
implementasi penyimpanan codec software default di
frameworks/av/media/codec2/vndk/C2Store.cpp
.
Saat menggunakan APEX Anda sendiri, susun layanan codec dan muat file APEX
menggunakan proses yang sama seperti layanan mediaswcodec
. Untuk melakukannya, tentukan
library bersama tingkat atas yang bertanggung jawab untuk mendaftarkan semua komponen C2, lalu
buat paket APEX (dengan dependensi transitif) yang berada dalam partisi
vendor. Saat proses layanan codec vendor dimulai, proses tersebut dapat memuat
titik entri tingkat atas ini.
Membuat ekstraktor
Saat menambahkan ekstraktor untuk format baru, pastikan ekstraktor hanya bergantung pada
API NDK yang stabil dan tidak bergantung pada API pribadi apa pun. Ekstraktor harus
mengimplementasikan API yang ditentukan oleh
frameworks/av/include/media/MediaExtractorPluginApi.h
dan dapat menggunakan wrapper praktis
C++ di
frameworks/av/include/media/MediaExtractorPluginHelper.h
. Karena Android
10 atau yang lebih tinggi hanya mendukung versi
ekstraktor API tertinggi, pastikan Anda membuat model ekstraktor sesuai dengan ekstraktor dengan
nomor versi API tertinggi.
Tempatkan ekstraktor kustom di /system/lib/64/extractors
atau APEX vendor,
yang dibuka bersama dengan APEX Google yang berisi ekstraktor Google. Untuk
memverifikasi framework yang memuat ekstraktor Anda, jalankan perintah berikut.
adb shell dumpsys media.extractor
Anda akan mendapatkan daftar ekstraktor yang tersedia dan serupa dengan berikut ini.
Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)
Jika ekstraktor kustom mendukung format yang telah didukung oleh
ekstraktor yang disediakan Google, Anda dapat memaksa framework untuk menggunakan ekstraktor
menggunakan fungsi Sniff()
untuk menampilkan tingkat keyakinan yang lebih tinggi daripada
yang disediakan Google.
Saat framework media memuat ekstraktor (dari /system/lib/64/extractors
atau dari APEX vendor), framework media akan mengenali file tersebut dan mendapatkan informasi tentang
kontennya. Langkah berikutnya adalah menambahkan decoder untuk format tersebut agar framework dapat
memahami cara mengurai konten file.
Membuat decoder kustom
Anda memerlukan decoder kustom untuk format apa pun yang belum didukung oleh decoder yang disediakan Google. Contoh:
Guna menambahkan dukungan framework media untuk file AVI yang berisi MP3, Anda memerlukan ekstraksi AVI , tetapi tidak memerlukan decoder MP3 karena sudah ada.
Guna menambahkan dukungan framework media untuk file AVI yang berisi Windows Media, Anda memerlukan ekstraktor AVI dan decoder Windows Media.
Menambahkan decoder baru mirip dengan menambahkan decoder hardware Anda sendiri untuk AVC atau HEVC.
Meskipun ekstraktor memublikasikan jenis MIME dari trek media yang ada di dalamnya, codec yang mendukung jenis MIME ini harus ada agar file dapat didukung sepenuhnya. String jenis MIME sebenarnya yang digunakan benar-benar merupakan perjanjian antara ekstraktor dan codec (string tidak perlu ditambahkan ke file MediaDefs.h
).
Mengintegrasikan dengan pemindai media
Pemindai media mencari jenis file baru dan menambahkannya ke database media.
Agar pemindai media dapat menangani jenis file kustom Anda, pemindai perlu
mengetahuinya. Di Android 10 atau yang lebih tinggi, MimeUtils
(dalam libcore
) mempertahankan pemetaan MIME ke ekstensi. Sebelumnya, pemetaan ini
ditangani dalam file MediaFile.java
, yang terus berisi pemetaan dari
jenis MIME ke konstanta format MTP.
Ekstraktor dapat mengekspor daftar ekstensi nama file yang didukungnya (seperti MP3
atau MP4). Namun, hanya LegacyMediaScanner
yang menggunakannya; hal ini tidak berpengaruh pada
ModernMediaScanner
, yang digunakan secara default.