Personalización de componentes multimedia

Puede ampliar los componentes del extractor de medios y del códec de medios mediante extensiones de proveedores. Las API MediaSession2 y MediaParser no se pueden personalizar (pero puede realizar cambios ascendentes para las API heredadas de MediaPlayer y MediaSession ).

Para admitir tipos de medios adicionales en el marco de medios de Android, debe crear un extractor y un decodificador personalizados. Por ejemplo, para agregar soporte para video de Windows Media en archivos AVI, debe crear un Extractor de AVI y un Decodificador de video de Windows Media.

Acerca de las extensiones

Si los extractores de medios predeterminados no cumplen con sus requisitos, puede colocar complementos de extractores personalizados en /system/lib[64]/extractors/ . El proceso de extracción carga automáticamente los complementos de extracción del paquete APEX proporcionado por Google y de /system/lib[64]/extractors/ .

De manera similar, puede configurar servicios de códec de medios personalizados que usan la interfaz Codec 2.0 definida en frameworks/av/media/codec2/core/ . Para una implementación básica, consulte frameworks/av/media/codec2/hidl/services/ . El punto de entrada de la biblioteca es la interfaz C2ComponentStore . Para ver un ejemplo, consulte la implementación predeterminada del almacén de códecs de software en frameworks/av/media/codec2/vndk/C2Store.cpp .

Cuando utilice su propio APEX, estructure el servicio de códec y cargue el archivo APEX utilizando los mismos procesos que el servicio mediaswcodec . Para hacerlo, defina una biblioteca compartida de nivel superior responsable de registrar todos los componentes C2, luego cree un paquete APEX (con dependencias transitivas) que resida en la partición del proveedor. Cuando se inicia el proceso de servicio del códec del proveedor, puede cargar este punto de entrada de nivel superior.

Creando un extractor

Al agregar un extractor para un nuevo formato, asegúrese de que el extractor dependa solo de las API de NDK estables y no dependa de ninguna API privada. Los extractores deben implementar la API definida por frameworks/av/include/media/MediaExtractorPluginApi.h y pueden usar los contenedores de conveniencia de C++ en frameworks/av/include/media/MediaExtractorPluginHelper.h . Debido a que Android 10 o superior solo admite la versión más alta de la API del extractor, asegúrese de modelar su extractor según el extractor con el número de versión de API más alto.

Coloque los extractores personalizados en /system/lib/64/extractors o en un APEX de proveedor, que se abre junto con el APEX de Google que contiene los extractores de Google. Para verificar que el marco cargó su extractor, ejecute el siguiente comando.

adb shell dumpsys media.extractor

Debería obtener una lista de extractores disponibles similar a la siguiente.

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)

Si su extractor personalizado admite un formato que ya es compatible con un extractor proporcionado por Google, puede obligar al marco a usar su extractor usando la función Sniff() para devolver un nivel de confianza más alto que el proporcionado por Google.

Cuando el marco de medios carga su extractor (desde /system/lib/64/extractors o desde un proveedor APEX), reconoce el archivo y obtiene información sobre su contenido. El siguiente paso es agregar un decodificador para el formato para que el marco pueda entender cómo analizar el contenido del archivo.

Creación de un decodificador personalizado

Necesita un decodificador personalizado para cualquier formato que aún no sea compatible con un decodificador proporcionado por Google. Por ejemplo:

  • Para agregar soporte de marco de medios para archivos AVI que contengan MP3, necesita un extractor de AVI pero no necesita un decodificador de MP3 porque ya existe uno.

  • Para agregar soporte de marco de medios para archivos AVI que contienen Windows Media, necesita un extractor de AVI y un decodificador de Windows Media.

Agregar un nuevo decodificador es similar a agregar sus propios decodificadores de hardware para AVC o HEVC.

Si bien el extractor publica el tipo MIME de las pistas multimedia que contiene, los códecs que admiten estos tipos MIME deben estar presentes para que el archivo sea totalmente compatible. La cadena de tipo MIME real utilizada es estrictamente un acuerdo entre el extractor y el códec (no es necesario agregar la cadena al archivo MediaDefs.h ).

Integración con escáner de medios

El escáner de medios busca nuevos tipos de archivos y los agrega a la base de datos de medios. Para que el escáner de medios maneje su tipo de archivo personalizado, el escáner debe saberlo. En Android 10 o superior, MimeUtils (en libcore ) mantiene el mapeo de MIME a extensión. Anteriormente, esta asignación se manejaba en el archivo MediaFile.java , que continúa conteniendo una asignación de tipo MIME a constantes de formato MTP.

Un extractor puede exportar una lista de extensiones de nombre de archivo compatibles (como MP3 o MP4). Sin embargo, solo LegacyMediaScanner usa eso; no tiene ningún efecto en ModernMediaScanner , que se usa de forma predeterminada.