Menyesuaikan Komponen Media

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

Untuk mendukung jenis media tambahan dalam kerangka kerja 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 Windows Media video Decoder .

Tentang ekstensi

Jika ekstraktor media default tidak memenuhi persyaratan Anda, 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 mengatur layanan codec media kustom 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 . Sebagai contoh, lihat implementasi penyimpanan codec perangkat lunak default di frameworks/av/media/codec2/vndk/C2Store.cpp .

Saat menggunakan APEX Anda sendiri, buat struktur 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, itu kemudian dapat memuat titik masuk 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 pembungkus praktis C++ di frameworks/av/include/media/MediaExtractorPluginHelper.h . Karena Android 10 atau lebih tinggi hanya mendukung versi API ekstraktor tertinggi, pastikan untuk memodelkan ekstraktor Anda setelah ekstraktor dengan nomor versi API tertinggi.

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

adb shell dumpsys media.extractor

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

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

Membuat dekoder khusus

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

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

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

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

Sementara ekstraktor menerbitkan jenis MIME dari trek media yang dikandungnya, codec yang mendukung jenis MIME ini harus ada agar file didukung sepenuhnya. String tipe MIME aktual yang digunakan benar-benar merupakan kesepakatan antara extractor 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 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 di file MediaFile.java , yang terus berisi pemetaan dari tipe MIME ke konstanta 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.