Za pomocą rozszerzeń dostawcy możesz rozszerzyć komponenty ekstraktora multimediów i kodeka multimediów. Interfejsów MediaSession2 i MediaParser nie można dostosowywać (ale możesz przesyłać zmiany w skierowaniu do interfejsów API MediaPlayer
i MediaSession
).
Aby obsługiwać dodatkowe typy multimediów w ramach frameworku multimediów Androida, musisz utworzyć niestandardowy ekstraktor i dekoder. Aby na przykład dodać obsługę filmów Windows Media w plikach AVI, musisz utworzyć Extractor (wyodrębniacz) plików AVI i Decoder (dekoder) filmów Windows Media.
Rozszerzenia
Jeśli domyślne narzędzia do wyodrębniania multimediów nie spełniają Twoich wymagań, możesz umieścić w /system/lib[64]/extractors/
niestandardowe wtyczki narzędzi do wyodrębniania. Proces ekstraktora automatycznie wczytuje wtyczki ekstraktora z opakowania APEX udostępnianego przez Google oraz z /system/lib[64]/extractors/
.
Podobnie możesz skonfigurować niestandardowe usługi kodeków multimediów, które korzystają z interfejsu Codec 2.0 zdefiniowanego w frameworks/av/media/codec2/core/
. Podstawową implementację znajdziesz w artykule frameworks/av/media/codec2/hidl/services/
. Punkt wejścia biblioteki to interfejs C2ComponentStore
. Przykładem jest domyślna implementacja magazynu kodeków oprogramowania na stronie frameworks/av/media/codec2/vndk/C2Store.cpp
.
Jeśli używasz własnego APEX, uporządkuj usługę kodeka i załaduj plik APEX za pomocą tych samych procesów co usługa mediaswcodec
. Aby to zrobić, zdefiniuj najwyższą bibliotekę wspólną na poziomie najwyższym, która odpowiada za rejestrowanie wszystkich komponentów C2, a następnie utwórz pakiet APEX (z zależnościami transitive), który znajduje się w partycji dostawcy. Gdy rozpocznie się proces usługi kodeka dostawcy, może on wczytać ten punkt wejścia najwyższego poziomu.
Tworzenie ekstraktora
Podczas dodawania ekstraktora dla nowego formatu upewnij się, że zależy on tylko od stabilnych interfejsów NDK i nie korzysta z żadnych interfejsów prywatnych. Ekstrektory powinny implementować interfejs API zdefiniowany przez frameworks/av/include/media/MediaExtractorPluginApi.h
i można w nich używać wygodnej obudowy w C++ (frameworks/av/include/media/MediaExtractorPluginHelper.h
). Android w wersji 10 lub nowszej obsługuje tylko najwyższą wersję interfejsu API ekstraktora, dlatego modeluj swój ekstraktor na podstawie ekstraktora z najwyższym numerem wersji interfejsu API.
Umieść niestandardowe ekstraktory w poziomie /system/lib/64/extractors
lub w poziomie dostawcy APEX, który otwiera się razem z poziomem Google APEX zawierającym ekstraktory Google. Aby sprawdzić, czy framework załadował wyodrębniacz, uruchom to polecenie.
adb shell dumpsys media.extractor
Powinna pojawić się lista dostępnych ekstraktorów podobna do tej.
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)
Jeśli Twój niestandardowy ekstraktor obsługuje format, który jest już obsługiwany przez ekstraktor udostępniony przez Google, możesz zmusić framework do użycia Twojego ekstraktora, używając funkcji Sniff()
, aby zwrócić wyższy poziom pewności niż ten, który zapewnia ekstraktor udostępniony przez Google.
Gdy framework mediów wczyta narzędzie do ekstrakcji (z /system/lib/64/extractors
lub od dostawcy APEX), rozpoznaje plik i pobiera informacje o jego zawartości. Kolejnym krokiem jest dodanie dekodera dla formatu, aby framework wiedział, jak analizować zawartość pliku.
Tworzenie dekodera niestandardowego
W przypadku formatów, które nie są obsługiwane przez dekoder udostępniony przez Google, potrzebujesz dekodera niestandardowego. Na przykład:
Aby dodać obsługę frameworku multimedialnego dla plików AVI zawierających MP3, potrzebujesz dekodera AVI, ale nie potrzebujesz dekodera MP3, ponieważ już istnieje.
Aby dodać obsługę frameworka multimediów dla plików AVI zawierających Windows Media, potrzebujesz zarówno narzędzia do wyodrębniania AVI, jak i dekodera Windows Media.
Dodawanie nowego dekodera jest podobne do dodawania własnych dekoderów sprzętowych dla AVC lub HEVC.
Wyodrętnik publikuje typ MIME zawierających się w nim ścieżek multimedialnych, ale aby plik był w pełni obsługiwany, muszą być obecne kodeki obsługujące te typy MIME. Używany ciąg tekstowy typu MIME jest ściśle określony przez wyodrębniacz i kodek (nie musi być dodawany do pliku MediaDefs.h
).
Integracja ze skanerem multimediów
Skaner multimediów wyszukuje nowe typy plików i dodaje je do bazy danych multimediów.
Aby skaner multimediów obsługiwał niestandardowy typ pliku, musi o nim wiedzieć. W Androidzie 10 lub nowszym MimeUtils
(w libcore
) zachowuje mapowanie MIME na rozszerzenie. Wcześniej to mapowanie było obsługiwane w pliku MediaFile.java
, który nadal zawiera mapowanie typu MIME na stałe formatu MTP.
Narzędzie do wyodrębniania może eksportować listę obsługiwanych rozszerzeń nazw plików (np. MP3 lub MP4). Jednak tylko LegacyMediaScanner
korzysta z tego ustawienia. Nie ma ono wpływu na ModernMediaScanner
, które jest używane domyślnie.