Personalizar componentes de mídia

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

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

Sobre as extensões

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

Da mesma forma, é possível configurar serviços de codec de mídia personalizados que usam a interface Codec 2.0 definida em frameworks/av/media/codec2/core/. Para um modelo implementação, consulte frameworks/av/media/codec2/hidl/services/. O ponto de entrada da biblioteca é a interface C2ComponentStore. Para ver um exemplo, consulte para a implementação do armazenamento de codec de software padrão 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 do serviço mediaswcodec. Para isso, defina um uma biblioteca compartilhada de nível superior responsável por registrar todos os componentes C2, criar um pacote APEX (com dependências transitivas) que resida no provedor partição. Quando o processo do serviço de codec do fornecedor for iniciado, ele poderá carregar esse um ponto de entrada de alto nível.

Criar um extrator

Ao adicionar um extrator para um novo formato, verifique se ele depende apenas de APIs estáveis do NDK e não depende de APIs particulares. Os extratores precisam implementar a API definida por frameworks/av/include/media/MediaExtractorPluginApi.h e podem usar os wrappers de conveniência C++ em frameworks/av/include/media/MediaExtractorPluginHelper.h. Como o Android A versão 10 ou superior suporta apenas a versão mais recente do da API do extrator, certifique-se de modelar seu extrator com base no extrator com o o número mais alto da versão da API.

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

adb shell dumpsys media.extractor

Você vai receber uma lista de extratores disponíveis semelhante a esta.

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á é suportado por uma Extrator fornecido pelo Google, você pode forçar a estrutura a usar seu extrator usando a função Sniff() para retornar um nível de confiança maior do que o um fornecido pelo Google.

Quando o framework de mídia carrega seu extrator (de /system/lib/64/extractors ou de um APEX do fornecedor), ele reconhece o arquivo e recebe informações sobre o conteúdo. 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 uma decodificador fornecido pelo Google. Exemplo:

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

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

Adicionar um novo decodificador é semelhante à adição de decodificadores de hardware próprios para AVC ou HEVC.

O extrator publica o tipo MIME das faixas de mídia que contém, os codecs que suportam esses tipos MIME devem estar presentes para o seja totalmente compatível. A string de tipo MIME usada é estritamente um acordo entre o extrator e o codec. A string não precisa ser adicionada ao arquivo MediaDefs.h.

Integrar com o scanner de mídia

O Media Scanner procura novos tipos de arquivo e os adiciona ao banco de dados de mídia. Para que o leitor de mídia processe seu tipo de arquivo personalizado, ele precisa conhecer esse tipo. No Android 10 ou mais recente, MimeUtils (em libcore) mantém o mapeamento MIME para extensão. Anteriormente, esse mapeamento era gerenciado no arquivo MediaFile.java, que continua contendo um mapeamento do tipo MIME para constantes de formato MTP.

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