Personalizar componentes multimedia

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

Para admitir tipos de medios adicionales en el marco de medios de Android, debe crear un extractor y decodificador personalizado. Por ejemplo, para agregar soporte para video de Windows Media en archivos AVI, necesita 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 extracción 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 multimedia personalizados que utilicen la interfaz Codec 2.0 definida en frameworks/av/media/codec2/core/ . Para obtener 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 del almacén de códecs de software predeterminado 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 y luego cree un paquete APEX (con dependencias transitivas) que resida en la partición del proveedor. Cuando se inicia el proceso de servicio de códec del proveedor, puede cargar este punto de entrada de nivel superior.

crear un extractor

Al agregar un extractor para un nuevo formato, asegúrese de que el extractor dependa solo de API 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 prácticos contenedores 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 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 forzar 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 multimedia 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.

Crear un decodificador personalizado

Necesita un descodificador personalizado para cualquier formato que no sea compatible con un descodificador proporcionado por Google. Por ejemplo:

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

  • Para agregar compatibilidad con el marco multimedia 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 ).

Integrar con el 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 necesita saberlo. En Android 10 o superior, MimeUtils (en libcore ) mantiene la asignación de MIME a extensión. Anteriormente, esta asignación se manejaba en el archivo MediaFile.java , que continúa conteniendo una asignación de constantes de tipo MIME a formato MTP.

Un extractor puede exportar una lista de extensiones de nombre de archivo que admite (como MP3 o MP4). Sin embargo, sólo LegacyMediaScanner usa eso; no tiene ningún efecto sobre ModernMediaScanner , que se utiliza de forma predeterminada.