Вы можете расширить компоненты извлечения и кодирования медиаконтента с помощью расширений поставщика. API MediaSession2 и MediaParser нельзя настраивать (но вы можете отправить изменения для устаревших API MediaPlayer и MediaSession).
Чтобы добавить в медиафреймворк Android поддержку дополнительных типов медиаконтента, вам нужно создать собственный экстрактор и декодер. Например, чтобы добавить поддержку видео Windows Media в файлах AVI, необходимо создать экстрактор AVI и декодер видео Windows Media.
Расширения
Если стандартные экстракторы медиаконтента не соответствуют вашим требованиям, вы можете разместить специальные плагины экстракторов в папке /system/lib[64]/extractors/. Процесс извлечения автоматически загружает плагины из пакета APEX, предоставленного Google, и из /system/lib[64]/extractors/.
Аналогичным образом можно настроить собственные сервисы медиакодеков, которые используют интерфейс Codec 2.0, определенный в frameworks/av/media/codec2/core/. Инструкции по базовой реализации приведены в статье frameworks/av/media/codec2/hidl/services/. Точка входа в библиотеку – интерфейс C2ComponentStore. Пример реализации хранилища программных кодеков по умолчанию можно найти в файле frameworks/av/media/codec2/vndk/C2Store.cpp.
При использовании собственного APEX-файла структурируйте сервис кодека и загрузите APEX-файл, используя те же процессы, что и для сервиса mediaswcodec. Для этого определите общую библиотеку верхнего уровня, которая будет регистрировать все компоненты C2, а затем создайте пакет APEX (с транзитивными зависимостями), который будет находиться в разделе поставщика. Когда запускается процесс службы кодеков поставщика, он может загрузить эту точку входа верхнего уровня.
Как создать экстрактор
При добавлении экстрактора для нового формата убедитесь, что он зависит только от стабильных API NDK и не зависит от закрытых API. Извлекатели должны реализовать API, определенный в frameworks/av/include/media/MediaExtractorPluginApi.h, и могут использовать удобные оболочки C++, описанные в frameworks/av/include/media/MediaExtractorPluginHelper.h. Поскольку Android 10 или более поздние версии поддерживают только последнюю версию API экстрактора, убедитесь, что ваш экстрактор создан на основе экстрактора с самым высоким номером версии API.
Разместите специальные экстракторы в /system/lib/64/extractors или APEX поставщика, который открывается вместе с APEX Google, содержащим экстракторы Google. Чтобы убедиться, что фреймворк загрузил ваш экстрактор, выполните следующую команду:
adb shell dumpsys media.extractorВы должны получить список доступных экстракторов, похожий на следующий.
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)
Если ваш экстрактор поддерживает формат, который уже поддерживается экстрактором от Google, вы можете заставить фреймворк использовать ваш экстрактор, применив функцию Sniff(), чтобы вернуть более высокий уровень достоверности, чем у экстрактора от Google.
Когда медиафреймворк загружает ваш экстрактор (из /system/lib/64/extractors или из APEX-пакета поставщика), он распознает файл и получает информацию о его содержимом. Затем нужно добавить декодер для формата, чтобы фреймворк мог понять, как анализировать содержимое файла.
Как создать собственный декодер
Вам понадобится специальный декодер для любого формата, который ещё не поддерживается декодером, предоставленным Google. Пример:
Чтобы добавить поддержку медиафреймворка для файлов AVI, содержащих MP3, вам понадобится экстрактор AVI, но не понадобится декодер MP3, поскольку он уже существует.
Чтобы добавить поддержку медиафреймворка для AVI-файлов, содержащих Windows Media, вам понадобится как экстрактор AVI, так и декодер Windows Media.
Добавление нового декодера похоже на добавление собственных аппаратных декодеров для AVC или HEVC.
Извлечение публикует MIME-тип медиадорожек, которые оно содержит, но для полной поддержки файла необходимы кодеки, поддерживающие эти MIME-типы. Фактическая строка MIME-типа используется только по соглашению между извлекателем и кодеком (добавлять строку в файл MediaDefs.h не нужно).
Интеграция со сканером медиафайлов
Сканер мультимедиа ищет новые типы файлов и добавляет их в базу данных мультимедиа.
Чтобы сканер мультимедиа мог обрабатывать файлы вашего типа, ему нужно сообщить о нем. В Android 10 или более поздней версии MimeUtils (в libcore) сохраняет соответствие MIME-типов расширениям. Ранее это сопоставление выполнялось в файле MediaFile.java, который по-прежнему содержит сопоставление MIME-типа с константами формата MTP.
Экстрактор может экспортировать список поддерживаемых расширений файлов (например, MP3 или MP4). Однако этот параметр используется только в LegacyMediaScanner. Он не влияет на ModernMediaScanner, который используется по умолчанию.