Anda dapat memperluas komponen ekstraktor media dan codec media menggunakan vendor
ekstensi. MediaSession2 dan MediaParser API tidak dapat disesuaikan (tetapi Anda
dapat melakukan perubahan upstream untuk MediaPlayer
API dan MediaSession
lama).
Untuk mendukung jenis media lainnya dalam framework media Android, Anda harus buat ekstraktor dan decoder kustom. Misalnya, untuk menambahkan dukungan bagi video Windows Media dalam file AVI, Anda perlu membuat file AVI Extractor 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 Codec 2.0
antarmuka yang ditentukan di frameworks/av/media/codec2/core/
. Untuk dasar
selengkapnya, lihat frameworks/av/media/codec2/hidl/services/
. Tujuan
titik entri library adalah antarmuka C2ComponentStore
. Lihat contoh
ke implementasi penyimpanan codec perangkat
lunak {i>default<i} 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
perpustakaan bersama tingkat atas yang bertanggung
jawab untuk mendaftarkan semua komponen C2, maka
membuat paket APEX (dengan dependensi transitif) yang berada di vendor
partisi. Ketika proses layanan {i>codec<i} vendor dimulai, proses itu dapat memuat ini
titik masuk tingkat atas.
Membuat ekstraktor
Saat menambahkan ekstraktor untuk format baru, pastikan ekstraktor hanya bergantung pada
NDK API stabil dan tidak bergantung pada API pribadi apa pun. Ekstraktor seharusnya
mengimplementasikan API yang didefinisikan oleh
frameworks/av/include/media/MediaExtractorPluginApi.h
dan dapat menggunakan C++
wrapper praktis di
frameworks/av/include/media/MediaExtractorPluginHelper.h
. Karena Android
10 atau lebih tinggi hanya mendukung versi tertinggi
ekstraktor, pastikan Anda membuat model ekstraktor sesuai 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. Kepada
memastikan bahwa framework 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 Anda mendukung format yang telah didukung oleh
Ekstraktor yang disediakan Google, Anda dapat memaksa framework untuk menggunakan ekstraktor dengan
menggunakan fungsi Sniff()
untuk menampilkan tingkat keyakinan yang lebih tinggi daripada
yang disediakan Google.
Saat framework media memuat ekstraktor Anda (dari /system/lib/64/extractors
atau dari sebuah APEX vendor), ia mengenali file
tersebut dan mendapatkan informasi tentang
saat ini. Langkah berikutnya adalah menambahkan decoder untuk format tersebut agar framework dapat
memahami cara
mengurai isi file.
Membuat decoder kustom
Anda memerlukan decoder kustom untuk format apa pun yang belum didukung oleh Decoder yang disediakan Google. Contoh:
Untuk menambahkan dukungan framework media untuk file AVI yang berisi MP3, Anda memerlukan AVI pengekstrak tetapi tidak memerlukan decoder MP3 karena sudah ada.
Untuk menambahkan dukungan kerangka kerja media untuk file AVI yang berisi Windows Media, Anda membutuhkan kedua ekstraktor AVI dan Windows Media Decoder.
Menambahkan decoder baru mirip dengan menambahkan decoder hardware Anda sendiri untuk AVC atau HEVC.
Selagi ekstraktor memublikasikan jenis MIME dari trek media yang
berisi, codec yang mendukung jenis MIME ini harus ada
file Anda akan didukung sepenuhnya. String jenis MIME aktual yang digunakan benar-benar merupakan
perjanjian antara ekstraktor dan codec ({i>string<i} 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 harus
ketahui tentang hal itu. Di Android 10 atau yang lebih tinggi, MimeUtils
(di
libcore
) mempertahankan pemetaan MIME ke ekstensi. Sebelumnya, pemetaan ini
ditangani di file MediaFile.java
, yang 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; ini tidak berdampak pada
ModernMediaScanner
, yang digunakan secara default.