Komponenty wyodrębniania multimediów i kodeka multimediów możesz rozszerzać za pomocą rozszerzeń dostawców. Interfejsów MediaSession2 i MediaParser nie można dostosowywać (ale możesz przesyłać zmiany w starszych interfejsach API MediaPlayer
i MediaSession
).
Aby obsługiwać dodatkowe typy multimediów w platformie multimedialnej Androida, musisz utworzyć niestandardowy ektraktor i dekoder. Aby na przykład dodać obsługę filmów Windows Media w plikach AVI, musisz utworzyć Extractor dla plików AVI i Decoder dla filmów Windows Media.
Rozszerzenia
Jeśli domyślne moduły wyodrębniania multimediów nie spełniają Twoich wymagań, możesz umieścić w /system/lib[64]/extractors/
niestandardowe wtyczki tego modułu. Proces wyodrębniania automatycznie wczytuje wtyczki wyodrębniania z udostępnionego przez Google pakietu APEX i 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/
. Podstawowe informacje o implementacji znajdziesz tutaj: frameworks/av/media/codec2/hidl/services/
. Punkt wejścia biblioteki to interfejs C2ComponentStore
. Możesz na przykład sprawdzić domyślną implementację magazynu kodeków oprogramowania na stronie frameworks/av/media/codec2/vndk/C2Store.cpp
.
Jeśli używasz własnego punktu APEX, utwórz strukturę usługi kodeka i wczytaj plik APEX, korzystając z tych samych procesów co w usłudze mediaswcodec
. Aby to zrobić, zdefiniuj najwyższą bibliotekę na poziomie zasobów wspólnych, 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 zależy od żadnych prywatnych interfejsów API. Moduły wyodrębniania powinny wdrożyć interfejs API zdefiniowany przez frameworks/av/include/media/MediaExtractorPluginApi.h
i umożliwić używanie opakowań wygodnych języka C++ w 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 o najwyższym numerze wersji interfejsu API.
Umieść niestandardowe moduły wyodrębniania w /system/lib/64/extractors
lub APEX dostawcy, który jest otwierany razem z Google APEX zawierającym moduły wyodrębniania Google. Aby sprawdzić, czy platforma wczytała platformę wyodrębniania, uruchom poniższe 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 moduł wyodrębniania obsługuje format, który jest już obsługiwany przez moduł wyodrębniający udostępniony przez Google, możesz wymusić korzystanie z niego przez platformę, używając funkcji Sniff()
, aby zwrócić wyższy poziom ufności niż ten podany przez Google.
Gdy framework mediów wczyta ekstraktor (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.
Utwórz własny dekoder
W przypadku formatów, które nie są obsługiwane przez dekoder udostępniany przez Google, musisz użyć dekodera niestandardowego. Na przykład:
Aby dodać obsługę platformy multimediów w przypadku plików AVI zawierających MP3, potrzebujesz ekstratora AVI, ale nie potrzebujesz dekodera MP3, ponieważ taki 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 dla typu MIME jest ściśle uzgodniony między modułem wyodrębniania a kodekiem (nie trzeba go dodawać 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ł plik niestandardowego typu, musi o nim wiedzieć. W Androidzie 10 lub nowszym mapowanie MIME na rozszerzenia jest zapisywane w MimeUtils
(w libcore
). Wcześniej mapowanie było obsługiwane w pliku MediaFile.java
, który nadal zawiera mapowanie ze stałych typów MIME na stałe w formacie MTP.
Narzędzie do wyodrębniania może eksportować listę obsługiwanych rozszerzeń nazw plików (np. MP3 lub MP4). Jest ona jednak używana tylko przez LegacyMediaScanner
. Nie ma to wpływu na metodę ModernMediaScanner
, która jest używana domyślnie.