Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Personalización de componentes de medios

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

Para admitir tipos de medios adicionales en el marco de medios de Android, debe crear un extractor y decodificador personalizados . 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 extractores personalizados en /system/lib[64]/extractors/ . El proceso de extracción carga automáticamente los complementos de extracción desde el paquete APEX proporcionado por Google y desde /system/lib[64]/extractors/ .

Del mismo modo, puede configurar servicios de códec de medios personalizados que utilicen 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 de la tienda de códecs de software predeterminada 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 API 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 extractores personalizados en /system/lib/64/extractors o un APEX de proveedor, que se abre junto con Google APEX 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 utilizando 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.

Creando un decodificador personalizado

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

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

  • Para agregar soporte de marco de medios para archivos AVI que contengan 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 MediaDefs.h archivo MediaDefs.h ).

Integración 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 debe 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 del tipo MIME a las constantes de formato MTP.

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