Dostosowywanie komponentów multimedialnych

Za pomocą rozszerzeń dostawcy możesz rozszerzyć komponenty wyodrębniania multimediów i kodeków multimediów. Interfejsów MediaSession2 i MediaParser nie można dostosowywać (ale możesz przesyłać zmiany w starym interfejsie API MediaPlayerMediaSession).

Aby obsługiwać dodatkowe typy multimediów w platformie multimedialnej Androida, musisz wykonać te czynności: utworzysz niestandardowy ektraktor i dekoder. Przykład: aby dodać obsługę plików wideo Windows Media w plikach AVI, należy utworzyć plik AVI Wyodrębnianie i dekoder filmów Windows Media.

Rozszerzenia

Jeśli domyślne narzędzia do wyodrębniania multimediów nie spełniają Twoich wymagań, możesz umieścić w /system/lib[64]/extractors/ niestandardowe wtyczki narzędzi do wyodrębniania. Proces ekstraktora automatycznie wczytuje wtyczki z oprogramowania APEX udostępnianego przez Google oraz z /system/lib[64]/extractors/.

W podobny sposób można konfigurować usługi dla niestandardowych kodeków multimediów, które korzystają z Kodeka 2.0. zdefiniowany w interfejsie frameworks/av/media/codec2/core/. Podstawową implementację znajdziesz w artykule frameworks/av/media/codec2/hidl/services/. i punkt wejścia do biblioteki to interfejs C2ComponentStore. Przykładem jest domyślna implementacja sklepu z kodekiem oprogramowania na stronie frameworks/av/media/codec2/vndk/C2Store.cpp.

Jeśli używasz własnego interfejsu APEX, zbuduj strukturę usługi kodeka i wczytaj plik APEX. przy użyciu tych samych procesów co usługa mediaswcodec. Aby to zrobić, zdefiniuj najwyższą bibliotekę wspólną na poziomie najwyższym, 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. Po rozpoczęciu procesu usługi kodeka dostawcy może on wczytać i punkt wejścia najwyższego poziomu.

Utwórz wyodrębnianie

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. Programy wyodrębniające powinny zaimplementuj interfejs API zdefiniowany przez frameworks/av/include/media/MediaExtractorPluginApi.h i możesz używać języka C++ kody wygody w frameworks/av/include/media/MediaExtractorPluginHelper.h Ponieważ Android 10 lub nowsza obsługuje tylko najwyższą wersję API ekstraktora, pamiętaj, aby modelować ekstraktor po ekstrakcji za pomocą API o najwyższym numerze.

Umieść niestandardowe moduły wyodrębniania danych w regionie /system/lib/64/extractors lub APEX dostawcy, który jest otwierany razem z panelem Google APEX zawierającym moduły wyodrębniania Google. Do Sprawdź, czy platforma wczytała Twój ekstraktor, 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 ekstraktor obsługuje format, który jest już obsługiwany przez ekstraktor udostępniony przez Google, możesz zmusić framework do użycia Twojego ekstraktora, używając funkcji Sniff(), aby zwrócić wyższy poziom pewności niż ten, który zapewnia ekstraktor udostępniony 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. Następnym krokiem jest dodanie dekodera formatu, aby platforma mogła jak analizować zawartość pliku.

Tworzenie dekodera niestandardowego

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 multimedialnej dla plików AVI zawierających MP3, potrzebny jest plik AVI ale nie potrzebujesz dekodera MP3, bo 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 plików AVI, jak i dekodera Windows Media.

Dodawanie nowego dekodera przebiega podobnie 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 typu MIME to między modułem wyodrębniania a kodekiem (ciąg znaków nie musi być dodano 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ł pliki niestandardowego typu, skaner musi: o tym wiedzą. 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.

Narzędzie do wyodrębniania może eksportować listę obsługiwanych rozszerzeń nazw plików (np. MP3 lub MP4). Jest jednak używane tylko przez LegacyMediaScanner; nie ma wpływu na ModernMediaScanner (używana domyślnie).