Dostosowywanie komponentów multimedialnych

Możesz rozszerzyć komponenty ekstraktora multimediów i kodeka multimediów za pomocą rozszerzeń dostawcy. Interfejsów MediaSession2 i MediaParser API nie można dostosowywać (ale możesz przesłać zmiany do starszych interfejsów MediaPlayerMediaSession API).

Aby obsługiwać dodatkowe typy multimediów w platformie multimediów Androida, musisz utworzyć niestandardowy ekstraktordekoder. Aby na przykład dodać obsługę filmów Windows Media w plikach AVI, musisz utworzyć ekstraktor AVI i dekoder filmów Windows Media.

Rozszerzenia

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

Podobnie możesz skonfigurować niestandardowe usługi kodeków multimedialnych, które korzystają z interfejsu Codec 2.0 zdefiniowanego w frameworks/av/media/codec2/core/. Podstawową implementację znajdziesz w sekcji frameworks/av/media/codec2/hidl/services/. Punkt wejścia biblioteki to interfejs C2ComponentStore. Przykład domyślnej implementacji kodeka programowego znajdziesz na stronie frameworks/av/media/codec2/vndk/C2Store.cpp.

Jeśli używasz własnego pakietu APEX, skonstruuj usługę kodeka i załóż plik APEX za pomocą tych samych procesów co w przypadku usługi mediaswcodec. Aby to zrobić, zdefiniuj bibliotekę współdzieloną najwyższego poziomu, która będzie odpowiedzialna za rejestrowanie wszystkich komponentów C2, a następnie utwórz pakiet APEX (z zależnościami przechodnimi) znajdujący się w partycji dostawcy. Gdy proces usługi kodeka dostawcy zostanie uruchomiony, może wczytać ten najwyższy punkt wejścia.

Tworzenie ekstraktora

Podczas dodawania ekstraktora dla nowego formatu upewnij się, że zależy on tylko od stabilnych interfejsów API NDK i nie zależy od żadnych prywatnych interfejsów API. Ekstraktory powinny implementować interfejs API zdefiniowany w frameworks/av/include/media/MediaExtractorPluginApi.h i mogą używać wygodnych otoczek C++ w frameworks/av/include/media/MediaExtractorPluginHelper.h. Android 10 lub nowszy obsługuje tylko najnowszą wersję interfejsu Extractor API, więc model ekstraktora powinien być oparty na ekstraktorze z najwyższym numerem wersji interfejsu API.

Umieść niestandardowe ekstraktory w /system/lib/64/extractors lub w APEX-ie dostawcy, który jest otwierany razem z APEX-em Google zawierającym ekstraktory Google. Aby sprawdzić, czy framework załadował ekstraktor, uruchom to polecenie.

adb shell dumpsys media.extractor

Powinna pojawić się lista dostępnych ekstraktorów podobna do tej poniżej.

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 wymusić użycie Twojego ekstraktora, używając funkcji Sniff(), aby zwrócić wyższy poziom ufności niż ekstraktor dostarczony przez Google.

Gdy platforma multimedialna wczyta ekstraktor (z /system/lib/64/extractorslub z APEX dostawcy), rozpozna plik i uzyska informacje o jego zawartości. Następnym krokiem jest dodanie dekodera formatu, aby platforma mogła zrozumieć, jak analizować zawartość pliku.

Tworzenie dekodera niestandardowego

W przypadku każdego formatu, który nie jest jeszcze obsługiwany przez dekoder dostarczony przez Google, musisz mieć dekoder niestandardowy. Na przykład:

  • Aby dodać obsługę platformy multimedialnej 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, potrzebujesz zarówno ekstraktora AVI, jak i dekodera Windows Media.

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

Ekstraktor publikuje typ MIME ścieżek multimedialnych, które zawiera, ale aby plik był w pełni obsługiwany, muszą być dostępne kodeki obsługujące te typy MIME. Rzeczywisty ciąg tekstowy typu MIME jest ściśle określony w umowie między ekstraktorem 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 mógł obsługiwać Twój niestandardowy typ pliku, musi go znać. 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.

Ekstraktor może wyeksportować listę obsługiwanych rozszerzeń nazw plików (np. MP3 lub MP4). Jednak tylko LegacyMediaScanner korzysta z tej funkcji. Nie ma ona wpływu na ModernMediaScanner, która jest używana domyślnie.