Dostosuj komponenty multimediów

Komponenty wyodrębniania multimediów i kodeka multimediów możesz rozszerzać za pomocą rozszerzeń dostawców. Interfejsów MediaSession2 i MediaParser API nie można dostosować (ale możesz wprowadzić zmiany w starszych wersjach interfejsów 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, trzeba utworzyć moduł wyodrębniający i film Windows Mediadekodera AVI.

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/.

W podobny sposób można skonfigurować usługi niestandardowych 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/. Punktem wejścia biblioteki jest 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 bibliotekę współdzieloną najwyższego poziomu odpowiedzialną za rejestrowanie wszystkich komponentów C2, a następnie utwórz pakiet APEX (z zależnościami pośrednimi), który będzie się znajdował w partycji dostawcy. Po rozpoczęciu procesu usługi kodeka dostawcy może on wczytać ten punkt wejścia najwyższego poziomu.

Utwórz wyodrębnianie

Gdy dodajesz moduł wyodrębniania dla nowego formatu, upewnij się, że wyodrębnia on tylko stabilne interfejsy API NDK i nie zależy od żadnych prywatnych interfejsów API. Moduły wyodrębniania danych powinny wdrożyć zdefiniowany przez frameworks/av/include/media/MediaExtractorPluginApi.h interfejs API i umożliwić użycie opakowań wygodnych języka C++ w frameworks/av/include/media/MediaExtractorPluginHelper.h. Android 10 lub nowszy obsługuje tylko najwyższą wersję interfejsu API ekstratora, dlatego pamiętaj, aby modelować moduł wyodrębniania po module wyodrębniania 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 modułów wyodrębniania danych 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 platforma multimediów wczytuje ekstraktor (z /system/lib/64/extractors lub z APEX dostawcy), rozpoznaje plik i uzyskuje informacje o jego zawartości. Następnym krokiem jest dodanie dekodera formatu, który pozwoli platformie zrozumieć, jak analizować zawartość pliku.

Utwórz własny dekoder

Do każdego formatu, który nie jest jeszcze obsługiwany przez dekoder udostępniany przez Google, potrzebujesz niestandardowego dekodera. 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ę platformy multimediów dla plików AVI zawierających Windows Media, potrzebujesz zarówno wyodrębniania AVI, jak i dekodera Windows Media.

Dodawanie nowego dekodera przebiega podobnie jak dodawanie własnych dekoderów sprzętowych dla AVC lub HEVC.

Moduł wyodrębniający publikuje typ MIME zawartych w nim ścieżek multimedialnych, ale aby plik był w pełni obsługiwany, muszą być dostępne kodeki, które obsługują te typy MIME. Używany ciąg tekstowy dla typu MIME jest ściśle zgodny między modułem wyodrębniającym a kodekiem (nie trzeba go dodawać do pliku MediaDefs.h).

Integracja ze skanerem multimediów

Skaner multimediów szuka nowych typów plików i dodaje je do bazy danych. 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.

Moduł wyodrębniający może wyeksportować 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.