Personalizar componentes de mídia

Você pode estender os componentes do extrator de mídia e do codec de mídia usando extensões de fornecedor. As APIs MediaSession2 e MediaParser não podem ser personalizadas, mas é possível fazer mudanças upstream para as APIs MediaPlayer e MediaSession legadas.

Para oferecer suporte a outros tipos de mídia no framework de mídia do Android, é necessário criar um extrator e um decodificador personalizados. Por exemplo, para adicionar suporte a vídeos do Windows Media em arquivos AVI, você precisa criar um Extrator AVI e um Decodificador de vídeos do Windows Media.

Sobre as extensões

Se os extratores de mídia padrão não atenderem aos seus requisitos, coloque plug-ins de extração personalizados em /system/lib[64]/extractors/. O processo de extração carrega automaticamente os plug-ins de extração do pacote APEX fornecido pelo Google e do /system/lib[64]/extractors/.

Da mesma forma, você pode configurar serviços personalizados de codec de mídia que usam a interface Codec 2.0 definida em frameworks/av/media/codec2/core/. Para uma implementação básica, consulte frameworks/av/media/codec2/hidl/services/. O ponto de entrada da biblioteca é a interface C2ComponentStore. Para ver um exemplo, consulte a implementação de armazenamento de codec de software padrão em frameworks/av/media/codec2/vndk/C2Store.cpp.

Ao usar seu próprio APEX, estruture o serviço de codec e carregue o arquivo APEX usando os mesmos processos que o serviço mediaswcodec. Para isso, defina uma biblioteca compartilhada de nível superior responsável por registrar todos os componentes C2 e crie um pacote APEX (com dependências transitivas) que resida na partição do fornecedor. Quando o processo do serviço de codec do fornecedor for iniciado, ele poderá carregar esse ponto de entrada de nível superior.

Criar um extrator

Ao adicionar um extrator para um novo formato, verifique se ele depende apenas de APIs estáveis do NDK e de nenhuma API particular. Os extratores precisam implementar a API definida por frameworks/av/include/media/MediaExtractorPluginApi.h e podem usar os wrappers de conveniência do C++ em frameworks/av/include/media/MediaExtractorPluginHelper.h. Como o Android 10 ou versões mais recentes oferecem suporte apenas à versão mais recente da API do extrator, modele o extrator com base no extrator com o número de versão mais alto da API.

Coloque extratores personalizados no /system/lib/64/extractors ou um APEX de fornecedor, que é aberto junto com o APEX do Google que contém os extratores do Google. Para verificar se o framework carregou o extrator, execute o comando a seguir.

adb shell dumpsys media.extractor

Será exibida uma lista de extratores disponíveis semelhante à seguinte.

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)

Se o extrator personalizado for compatível com um formato que já é compatível com um extrator fornecido pelo Google, você poderá forçar o framework a usar o extrator usando a função Sniff() para retornar um nível de confiança maior do que o fornecido pelo Google.

Quando o framework de mídia carrega o extrator (de /system/lib/64/extractors ou de um APEX de fornecedor), ele reconhece o arquivo e recebe informações sobre o conteúdo dele. A próxima etapa é adicionar um decodificador para o formato, de modo que o framework possa entender como analisar o conteúdo do arquivo.

Criar um decodificador personalizado

Você precisa de um decodificador personalizado para qualquer formato que ainda não seja compatível com um decodificador fornecido pelo Google. Por exemplo:

  • Para adicionar suporte a framework de mídia para arquivos AVI contendo MP3, você precisa de um extrator AVI, mas não de um decodificador de MP3, porque já existe um.

  • Para adicionar suporte a framework de mídia para arquivos AVI contendo o Windows Media, você precisa de um extrator AVI e de um decodificador do Windows Media.

Adicionar um novo decodificador é semelhante a adicionar seus próprios decodificadores de hardware para AVC ou HEVC.

Enquanto o extrator publica o tipo MIME das faixas de mídia que ele contém, os codecs compatíveis com esses tipos MIME precisam estar presentes para que o arquivo seja totalmente compatível. A string do tipo MIME real usada é estritamente um acordo entre o extrator e o codec (a string não precisa ser adicionada ao arquivo MediaDefs.h).

Integrar com o detector de mídia

O detector de mídia procura novos tipos de arquivo e os adiciona ao banco de dados de mídia. Para que o detector de mídia lide com seu tipo de arquivo personalizado, o scanner precisa saber sobre ele. No Android 10 ou versões mais recentes, o MimeUtils (em libcore) mantém o mapeamento de MIME para extensão. Anteriormente, esse mapeamento era processado no arquivo MediaFile.java, que continua contendo um mapeamento do tipo MIME para as constantes do formato MTP.

Um extrator pode exportar uma lista de extensões de nome de arquivo compatíveis (como MP3 ou MP4). No entanto, apenas LegacyMediaScanner usa isso. Isso não afeta o ModernMediaScanner, que é usado por padrão.