Sesuaikan komponen media

Anda dapat memperluas komponen ekstraktor media dan codec media menggunakan ekstensi vendor. API MediaSession2 dan MediaParser tidak dapat dikustomisasi (tetapi Anda dapat melakukan perubahan upstream untuk MediaPlayer dan MediaSession API lama).

Untuk mendukung jenis media tambahan dalam kerangka media Android, Anda perlu membuat ekstraktor dan dekoder khusus. Misalnya, untuk menambahkan dukungan untuk video Windows Media dalam file AVI, Anda perlu membuat AVI Extractor dan Decoder video Windows Media.

Tentang ekstensi

Jika ekstraktor media default tidak memenuhi kebutuhan Anda, Anda dapat menempatkan plugin ekstraktor khusus 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 mengatur layanan codec media khusus yang menggunakan antarmuka Codec 2.0 yang ditentukan dalam frameworks/av/media/codec2/core/ . Untuk implementasi dasar, lihat frameworks/av/media/codec2/hidl/services/ . Titik masuk perpustakaan adalah antarmuka C2ComponentStore . Misalnya, lihat implementasi penyimpanan codec perangkat lunak 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 pustaka bersama tingkat atas yang bertanggung jawab untuk mendaftarkan semua komponen C2, lalu buat paket APEX (dengan dependensi transitif) yang berada di partisi vendor. Ketika proses layanan codec vendor dimulai, maka dapat memuat titik masuk tingkat atas ini.

Buat 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 pembungkus praktis C++ di frameworks/av/include/media/MediaExtractorPluginHelper.h . Karena Android 10 atau lebih tinggi hanya mendukung API ekstraktor versi tertinggi, pastikan untuk memodelkan ekstraktor Anda setelah ekstraktor dengan nomor versi API tertinggi.

Tempatkan ekstraktor khusus di /system/lib/64/extractors atau vendor APEX, yang dibuka bersama dengan Google APEX yang berisi ekstraktor Google. Untuk memverifikasi kerangka kerja yang memuat ekstraktor Anda, jalankan perintah berikut.

adb shell dumpsys media.extractor

Anda akan mendapatkan daftar ekstraktor yang tersedia 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 khusus Anda mendukung format yang sudah didukung oleh ekstraktor yang disediakan Google, Anda dapat memaksa kerangka kerja untuk menggunakan ekstraktor Anda dengan menggunakan fungsi Sniff() untuk mengembalikan tingkat kepercayaan yang lebih tinggi daripada yang disediakan Google.

Saat kerangka media memuat ekstraktor Anda (dari /system/lib/64/extractors atau dari vendor APEX), ia mengenali file tersebut dan mendapatkan informasi tentang kontennya. Langkah selanjutnya adalah menambahkan decoder untuk format tersebut sehingga framework dapat memahami cara mengurai konten file.

Buat dekoder khusus

Anda memerlukan dekoder khusus untuk format apa pun yang belum didukung oleh dekoder yang disediakan Google. Misalnya:

  • Untuk menambahkan dukungan kerangka media pada file AVI yang berisi MP3, Anda memerlukan ekstraktor AVI tetapi tidak memerlukan dekoder MP3 karena sudah ada.

  • Untuk menambahkan dukungan kerangka media untuk file AVI yang berisi Windows Media, Anda memerlukan ekstraktor AVI dan dekoder Windows Media.

Menambahkan dekoder baru mirip dengan menambahkan dekoder perangkat keras Anda sendiri untuk AVC atau HEVC.

Meskipun ekstraktor menerbitkan jenis MIME dari trek media yang ada di dalamnya, codec yang mendukung jenis MIME ini harus ada agar file dapat didukung sepenuhnya. String tipe MIME sebenarnya yang digunakan sepenuhnya merupakan kesepakatan antara ekstraktor dan codec (string tidak perlu ditambahkan ke file MediaDefs.h ).

Integrasikan dengan pemindai media

Pemindai media mencari jenis file baru dan menambahkannya ke database media. Agar pemindai media menangani jenis file khusus Anda, pemindai perlu mengetahuinya. Di Android 10 atau lebih tinggi, MimeUtils (dalam libcore ) mempertahankan pemetaan MIME-ke-ekstensi. Sebelumnya, pemetaan ini ditangani dalam file MediaFile.java , yang terus berisi pemetaan dari konstanta format MIME ke format MTP.

Ekstraktor dapat mengekspor daftar ekstensi nama file yang didukungnya (seperti MP3 atau MP4). Namun, hanya LegacyMediaScanner yang menggunakannya; itu tidak berpengaruh pada ModernMediaScanner , yang digunakan secara default.