Puedes ampliar los componentes del extractor y del códec multimedia con el proveedor
extensiones. Las APIs de MediaSession2 y MediaParser no se pueden personalizar (pero tú
puede realizar cambios ascendentes para las APIs heredadas de MediaPlayer
y MediaSession
).
Para admitir tipos de contenido multimedia adicionales en el framework multimedia de Android, debes hacer lo siguiente: crear un extractor y un decodificador personalizados Por ejemplo: Para agregar compatibilidad con videos de Windows Media en archivos AVI, debes crear un archivo AVI. Extractor y un Decodificador de videos de Windows Media.
Acerca de las extensiones
Si los extractores predeterminados de contenido multimedia no cumplen con tus requisitos, puedes cambiar
complementos de extracción personalizados en /system/lib[64]/extractors/
. El proceso del extractor
carga automáticamente los complementos de extracción desde el paquete APEX proporcionado por Google y
desde /system/lib[64]/extractors/
.
Del mismo modo, puedes configurar servicios de códecs multimedia personalizados que usen el códec 2.0.
definida en frameworks/av/media/codec2/core/
. Para obtener una
consulta frameworks/av/media/codec2/hidl/services/
. El
el punto de entrada de la biblioteca es la interfaz C2ComponentStore
. Por ejemplo, consulta
a la implementación predeterminada del almacén de códecs de software
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 hacerlo, define un
la biblioteca compartida de nivel superior responsable de registrar todos los componentes C2. Luego,
crear un paquete de APEX (con dependencias transitivas) que resida en el proveedor
por cada partición. Cuando se inicia el proceso del servicio de códecs del proveedor, este puede cargar
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
APIs de NDK estables y no depende de APIs privadas. Los extractores deberían
implementar la API definida por
frameworks/av/include/media/MediaExtractorPluginApi.h
y puede usar C++
envoltorios de conveniencia
frameworks/av/include/media/MediaExtractorPluginHelper.h
Dado que Android
10 o versiones posteriores solo admite la versión más alta del
API de extractor, asegúrate de modelar tu extractor a partir del extractor con el
el número de versión de API más alto.
Coloca extractores personalizados en /system/lib/64/extractors
o un APEX del proveedor,
que se abre junto con el APEX de Google que contiene los extractores de Google. Para
verifica que el framework haya cargado 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 es compatible con una
proporcionado por Google, puedes hacer que el framework use tu extractor de la siguiente manera:
usando la función Sniff()
para mostrar un nivel de confianza mayor que el
Una proporcionada por Google.
Cuando el framework multimedia carga el extractor (desde /system/lib/64/extractors
).
o de un proveedor APEX), reconoce el archivo y obtiene información sobre su
contenido. El próximo paso es agregar un decodificador para el formato, de modo que el framework pueda
entender cómo analizar el contenido del archivo.
Crea un decodificador personalizado
Necesitas un decodificador personalizado para cualquier formato que no sea compatible con una Decodificador proporcionado por Google Por ejemplo:
Para agregar compatibilidad con el marco de medios para archivos AVI que contengan MP3, necesitas un archivo AVI pero no necesita un decodificador MP3 porque ya existe uno.
Para agregar compatibilidad con el framework de medios para archivos AVI que contengan Windows Media, necesitarás un extractor AVI y un decodificador de Windows Media.
Agregar un nuevo decodificador es similar a agregar tus propios decodificadores de hardware para AVC o o HEVC.
Mientras que el extractor publica el tipo MIME, el contenido multimedia hace el seguimiento de
contiene, los códecs que admiten estos tipos de MIME deben estar presentes para el
sea completamente compatible. La cadena real de tipo de MIME usada es estrictamente una
un acuerdo entre el extractor y el códec (no es necesario que la cadena
se agregó al archivo MediaDefs.h
).
Cómo realizar la integración con el escáner multimedia
El escáner multimedia busca nuevos tipos de archivos y los agrega a la base de datos multimedia.
Para que el escáner multimedia controle tu tipo de archivo personalizado,
conozca su información. En Android 10 o versiones posteriores, MimeUtils
(en
libcore
) mantiene la asignación de MIME a extensión. Anteriormente, este mapeo era
se controla en el archivo MediaFile.java
, que sigue teniendo una asignación de
De tipo MIME a constantes de formato MTP.
Un extractor puede exportar una lista de extensiones de nombre de archivo que admiten (como MP3
o MP4). Sin embargo, solo LegacyMediaScanner
usa eso; no tiene efecto en
ModernMediaScanner
, que se usa de forma predeterminada.