Menyesuaikan komponen media

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

Untuk mendukung jenis media tambahan dalam framework media Android, Anda harus membuat ekstraktor dan decoder kustom. Misalnya, untuk menambahkan dukungan untuk video Windows Media dalam file AVI, Anda harus 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 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 dalam frameworks/av/media/codec2/core/. Untuk implementasi dasar, lihat frameworks/av/media/codec2/hidl/services/. Titik entri library adalah antarmuka C2ComponentStore. Untuk contohnya, 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 dengan 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 di 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 NDK API yang stabil dan tidak bergantung pada API pribadi. 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 API ekstraktor tertinggi, pastikan untuk memodelkan ekstraktor Anda setelah 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 bahwa framework memuat ekstraktor Anda, jalankan perintah berikut.

adb shell dumpsys media.extractor

Anda akan mendapatkan daftar ekstraktor yang tersedia yang mirip dengan yang berikut.

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 menampilkan tingkat kepercayaan yang lebih tinggi daripada yang disediakan Google.

Saat framework media memuat ekstraktor Anda (dari /system/lib/64/extractors atau dari APEX vendor), framework tersebut akan mengenali file dan mendapatkan informasi tentang kontennya. Langkah berikutnya adalah menambahkan decoder untuk format tersebut sehingga 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:

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

  • Untuk 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 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 secara ketat merupakan perjanjian antara ekstraktor dan codec (string tidak perlu ditambahkan ke file MediaDefs.h).

Melakukan integrasi 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 mengetahuinya. Di Android 10 atau yang lebih tinggi, MimeUtils (di 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 memengaruhi ModernMediaScanner, yang digunakan secara default.