Dostosuj komponenty multimediów

Komponenty modułu wyodrębniania multimediów i kodeka multimediów możesz rozszerzyć za pomocą dostawcy. rozszerzeń. 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 ramach platformy multimediów Androida, musisz utworzyć niestandardowy ekstraktordekoder. Aby na przykład dodać obsługę filmów Windows Media w plikach AVI, musisz utworzyć Extractor dla plików AVI i Decoder dla 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/. Punkt wejścia 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 Apex, ustrukturyzuj usługę kodeka i załaduj plik Apex za pomocą 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. Gdy rozpocznie się proces usługi kodeka dostawcy, może on załadować 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 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 Android w wersji 10 lub nowszej obsługuje tylko najwyższą wersję interfejsu API ekstraktora, dlatego modeluj swój ekstraktor na podstawie ekstraktora o najwyższym numerze wersji interfejsu API.

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 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 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ć na platformie wyodrębnianie za pomocą: przy użyciu funkcji Sniff() do zwrócenia wyższego poziomu ufności niż Udostępniany przez Google.

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

Utwórz własny dekoder

Do każdego formatu, który nie jest jeszcze obsługiwany przez Dekoder udostępniony przez Google. 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ę platformy multimediów dla plików AVI zawierających Windows Media, wymagają zarówno ekstraktora 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 jest ściśle określony przez ekstraktor i kodek (nie musi być dodawany 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ł pliki niestandardowego typu, skaner musi: o tym wiedzą. Na urządzeniu z Androidem 10 lub nowszym MimeUtils (w libcore) przechowuje mapowanie MIME na rozszerzenia. Wcześniej to mapowanie są obsługiwane w pliku MediaFile.java, który nadal zawiera mapowanie z Typ MIME na MTP.

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