Настройка медиа-компонентов

Вы можете расширить компоненты извлечения медиафайлов и кодеков, используя расширения от сторонних разработчиков. 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 и выше MimeUtilslibcore ) поддерживает сопоставление MIME-типов с расширениями. Ранее это сопоставление обрабатывалось в файле MediaFile.java , который по-прежнему содержит сопоставление MIME-типа с константами формата MTP.

Программа для извлечения данных может экспортировать список поддерживаемых расширений файлов (например, MP3 или MP4). Однако этот список используется только LegacyMediaScanner ; он не влияет на ModernMediaScanner , который используется по умолчанию.