Dostosowywanie komponentów multimedialnych

Komponenty ekstraktora multimediów i kodeka multimediów można rozszerzyć za pomocą rozszerzeń dostawców. Interfejsów API MediaSession2 i MediaParser nie można dostosowywać (ale można wprowadzać zmiany w starszych interfejsach API MediaPlayer i MediaSession ).

Aby obsługiwać dodatkowe typy multimediów w środowisku Android Media, musisz utworzyć niestandardowy ekstraktor i dekoder . Na przykład, aby dodać obsługę wideo Windows Media w plikach AVI, należy utworzyć Ekstraktor AVI i Dekoder wideo Windows Media.

O rozszerzeniach

Jeśli domyślne ekstraktory multimediów nie spełniają Twoich wymagań, możesz umieścić niestandardowe wtyczki ekstraktorów w /system/lib[64]/extractors/ . Proces wyodrębniania automatycznie ładuje wtyczki ekstraktora z pakietu APEX dostarczonego przez Google oraz z /system/lib[64]/extractors/ .

Podobnie możesz skonfigurować niestandardowe usługi kodeków multimedialnych, które używają interfejsu Codec 2.0 zdefiniowanego w frameworks/av/media/codec2/core/ . Aby zapoznać się z podstawową implementacją, zapoznaj się z frameworks/av/media/codec2/hidl/services/ . Punktem wejścia biblioteki jest interfejs C2ComponentStore . Aby zapoznać się z przykładem, zapoznaj się z domyślną implementacją magazynu koderów-dekoderów oprogramowania w frameworks/av/media/codec2/vndk/C2Store.cpp .

Korzystając z własnego APEX, uporządkuj usługę kodeka i załaduj plik APEX, korzystając z tych samych procesów, co usługa mediaswcodec . W tym celu zdefiniuj bibliotekę współdzieloną najwyższego poziomu odpowiedzialną za rejestrację wszystkich komponentów C2, a następnie utwórz pakiet APEX (z zależnościami przechodnimi), który rezyduje na partycji dostawcy. Po uruchomieniu procesu usługi kodera-dekodera dostawcy może on następnie załadować ten punkt wejścia najwyższego poziomu.

Tworzenie ekstraktora

Dodając ekstraktor dla nowego formatu, upewnij się, że jest on zależny tylko od stabilnych interfejsów API NDK i nie zależy od żadnych prywatnych interfejsów API. Ekstraktory powinny implementować interfejs API zdefiniowany przez frameworks/av/include/media/MediaExtractorPluginApi.h i mogą używać wygodnych opakowań C++ w frameworks/av/include/media/MediaExtractorPluginHelper.h . Ponieważ system Android 10 lub nowszy obsługuje tylko najwyższą wersję interfejsu API ekstraktora, pamiętaj, aby wzorować swój ekstraktor na wzór ekstraktora o najwyższym numerze wersji API.

Umieść niestandardowe ekstraktory w /system/lib/64/extractors lub dostawcy APEX, który jest otwierany wraz z Google APEX zawierającym ekstraktory Google. Aby sprawdzić, czy framework załadował twój ekstraktor, uruchom następujące polecenie.

adb shell dumpsys media.extractor

Powinieneś otrzymać listę dostępnych ekstraktorów podobną do poniższej.

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 dostarczony przez Google, możesz zmusić platformę do korzystania z twojego ekstraktora, używając funkcji Sniff() w celu zwrócenia wyższego poziomu pewności niż ten dostarczony przez Google.

Kiedy środowisko medialne ładuje twój ekstraktor (z /system/lib/64/extractors lub od dostawcy APEX), rozpoznaje plik i pobiera informacje o jego zawartości. Następnym krokiem jest dodanie dekodera dla formatu, aby struktura mogła zrozumieć, jak analizować zawartość pliku.

Tworzenie niestandardowego dekodera

Potrzebujesz niestandardowego dekodera dla dowolnego formatu, który nie jest jeszcze obsługiwany przez dekoder dostarczony przez Google. Na przykład:

  • Aby dodać wsparcie platformy medialnej dla plików AVI zawierających MP3, potrzebujesz ekstraktora AVI, ale nie potrzebujesz dekodera MP3, ponieważ taki już istnieje.

  • Aby dodać obsługę platformy multimedialnej dla plików AVI zawierających Windows Media, potrzebny jest zarówno ekstraktor AVI, jak i dekoder Windows Media.

Dodanie nowego dekodera jest podobne do dodawania własnych dekoderów sprzętowych dla AVC lub HEVC.

Podczas gdy ekstraktor publikuje typ MIME zawartych w nim ścieżek multimedialnych, kodeki obsługujące te typy MIME muszą być obecne, aby plik był w pełni obsługiwany. Rzeczywisty ciąg typu MIME jest ściśle uzgodniony między ekstraktorem a kodekiem (łańcuch 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, skaner musi o tym wiedzieć. W Androidzie 10 lub nowszym MimeUtils (w libcore ) utrzymuje mapowanie MIME-to-extension. Wcześniej to mapowanie było obsługiwane w pliku MediaFile.java , który nadal zawiera mapowanie stałych formatu typu MIME na MTP.

Ekstraktor może wyeksportować listę obsługiwanych rozszerzeń nazw plików (takich jak MP3 lub MP4). Jednak tylko LegacyMediaScanner używa tego; nie ma wpływu na ModernMediaScanner , który jest używany domyślnie.