Cómo personalizar los componentes de medios

Puedes extender los componentes del extractor de contenido multimedia y del códec de contenido multimedia con extensiones del proveedor. Las APIs de MediaSession2 y MediaParser no se pueden personalizar (pero puedes enviar cambios ascendentes para las APIs heredadas MediaPlayer y MediaSession).

Para admitir tipos de contenido multimedia adicionales en el framework de contenido multimedia de Android, debes crear un extractor y decodificador personalizados. Por ejemplo, para agregar compatibilidad con video de Windows Media en archivos AVI, debes crear un extractor de AVI y un decodificador de video de Windows Media .

Acerca de las extensiones

Si los extractores de contenido multimedia predeterminados no cumplen con tus requisitos, puedes colocar complementos de extractores personalizados en /system/lib[64]/extractors/. El proceso del extractor carga automáticamente los complementos del extractor del paquete APEX proporcionado por Google y de /system/lib[64]/extractors/.

Del mismo modo, puedes configurar servicios de códecs de contenido multimedia personalizados que usen la interfaz de Codec 2.0 definida en frameworks/av/media/codec2/core/. Para obtener una implementación básica, consulta frameworks/av/media/codec2/hidl/services/. El punto de entrada de la biblioteca es la interfaz C2ComponentStore. Para ver un ejemplo, consulta la implementación predeterminada del almacén de códecs de software en frameworks/av/media/codec2/vndk/C2Store.cpp.

Cuando uses tu propio APEX, estructura el servicio de códecs y carga el archivo APEX con los mismos procesos que el servicio mediaswcodec. Para ello, define una biblioteca compartida de nivel superior responsable de registrar todos los componentes C2 y, luego, crea un paquete APEX (con dependencias transitivas) que resida en la partición del proveedor. Cuando se inicia el proceso del servicio de códecs del proveedor, puede cargar este punto de entrada de nivel superior.

Crea un extractor

Cuando agregues un extractor para un formato nuevo, asegúrate de que el extractor solo dependa de las APIs de NDK estables y no de ninguna API privada. Los extractores deben implementar la API definida por frameworks/av/include/media/MediaExtractorPluginApi.h y pueden usar los wrappers de conveniencia de C++ en frameworks/av/include/media/MediaExtractorPluginHelper.h. Debido a que Android 10 o versiones posteriores solo admiten la versión más reciente de la API del extractor, asegúrate de modelar tu extractor según el extractor con el número de versión de API más alto.

Coloca extractores personalizados en /system/lib/64/extractors o en un APEX del proveedor, que se abre junto con el APEX de Google que contiene los extractores de Google. Para verificar que el framework cargó tu extractor, ejecuta el siguiente comando.

adb shell dumpsys media.extractor

Deberías 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 tu extractor personalizado admite un formato que ya admite un extractor proporcionado por Google, puedes forzar al framework a usar tu extractor con la función Sniff() para mostrar un nivel de confianza más alto que el proporcionado por Google.

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

Crea un decodificador personalizado

Necesitas un decodificador personalizado para cualquier formato que aún no admita un decodificador proporcionado por Google. Por ejemplo:

  • Para agregar compatibilidad con el framework de contenido multimedia para archivos AVI que contienen MP3, necesitas un extractor de AVI, pero no un decodificador de MP3 porque ya existe uno.

  • Para agregar compatibilidad con el framework de contenido multimedia para archivos AVI que contienen Windows Media, necesitas un extractor de AVI y un decodificador de Windows Media.

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

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

Realiza integraciones en el escáner de contenido multimedia

El escáner de contenido multimedia busca tipos de archivos nuevos y los agrega a la base de datos de contenido multimedia. Para que el escáner de contenido multimedia controle tu tipo de archivo personalizado, el escáner debe conocerlo. En Android 10 o versiones posteriores, MimeUtils (en libcore) mantiene la asignación de MIME a extensión. Anteriormente, esta asignación se controlaba en el archivo MediaFile.java, que sigue conteniendo una asignación de tipo de MIME a constantes de formato MTP.

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