Dostosowywanie komponentów multimedialnych

Komponenty wyodrębniania multimediów i kodeka multimediów możesz rozszerzyć za pomocą rozszerzeń dostawcy. Nie można dostosować interfejsów API MediaSession2 i MediaParser (ale możesz przesłać zmiany do starszych interfejsów API MediaPlayer i MediaSession).

Aby obsługiwać dodatkowe typy multimediów w platformie 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ć ekstraktor AVI i dekoder Windows Media .

Rozszerzenia – informacje

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

Podobnie możesz skonfigurować niestandardowe usługi kodeka multimediów, które korzystają z interfejsu Codec 2.0 zdefiniowanego w frameworks/av/media/codec2/core/. Podstawową implementację znajdziesz w frameworks/av/media/codec2/hidl/services/. Punktem wejścia do biblioteki jest interfejs C2ComponentStore. Przykład znajdziesz w domyślnej implementacji magazynu kodeków programowych w frameworks/av/media/codec2/vndk/C2Store.cpp.

Jeśli używasz własnego pakietu APEX, skonfiguruj usługę kodeka i wczytaj plik APEX za pomocą tych samych procesów co usługa 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), który znajduje się w partycji dostawcy. Gdy uruchomi 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 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ą korzystać z wygodnych otoczek C++ w frameworks/av/include/media/MediaExtractorPluginHelper.h. Android 10 lub nowszy obsługuje tylko najnowszą wersję interfejsu API ekstraktora, dlatego upewnij się, że Twój ekstraktor jest wzorowany na ekstraktorze z najwyższym numerem wersji interfejsu API.

Umieść niestandardowe ekstraktory w katalogu /system/lib/64/extractors lub w pakiecie APEX dostawcy, który jest otwierany razem z pakietem APEX Google zawierającym ekstraktory Google. Aby sprawdzić, czy platforma wczytała Twój ekstraktor, uruchom to polecenie.

adb shell dumpsys media.extractor

Powinna się wyświetlić 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 ekstraktor niestandardowy obsługuje format, który jest już obsługiwany przez ekstraktor dostarczony przez Google, możesz wymusić użycie Twojego ekstraktora przez platformę. W tym celu użyj funkcji Sniff() do zwrócenia wyższego poziomu pewności niż w przypadku ekstraktora dostarczonego przez Google.

Gdy platforma multimediów wczytuje Twój ekstraktor (z katalogu /system/lib/64/extractors lub z pakietu APEX dostawcy), rozpoznaje plik i uzyskuje informacje o jego zawartości. Następnym krokiem jest dodanie dekodera dla formatu, aby platforma mogła zrozumieć, jak analizować zawartość pliku.

Tworzenie niestandardowego dekodera

Niestandardowy dekoder jest potrzebny w przypadku każdego formatu, który nie jest jeszcze obsługiwany przez dekoder dostarczony przez Google. Przykład:

  • Aby dodać obsługę plików AVI zawierających MP3 w platformie multimediów, potrzebujesz ekstraktora AVI, ale nie potrzebujesz dekodera MP3, ponieważ taki dekoder już istnieje.

  • Aby dodać obsługę plików AVI zawierających Windows Media w platformie multimediów, 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 multimediów, 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 typu MIME jest ściśle uzgodniony 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 mapowanie typu MIME na rozszerzenie jest utrzymywane przez MimeUtils (w libcore). 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 eksportować listę obsługiwanych rozszerzeń nazw plików (np. MP3 lub MP4). Używa jej jednak tylko LegacyMediaScanner. Nie ma ona wpływu na ModernMediaScanner, który jest używany domyślnie.