É possível estender os componentes de extrator e codec de mídia usando extensões
do fornecedor. As APIs MediaSession2 e MediaParser não podem ser personalizadas, mas você pode fazer upstream de mudanças nas APIs legadas MediaPlayer
e MediaSession
.
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, crie um Extractor 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, coloque
plug-ins de extrator personalizados em /system/lib[64]/extractors/
. O processo de extração
carrega automaticamente plug-ins de extração do pacote APEX fornecido pelo Google e
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 uma implementação
básica, consulte frameworks/av/media/codec2/hidl/services/
. O ponto de entrada da biblioteca é a interface C2ComponentStore
. Para um exemplo, consulte
a implementação padrão da loja de codecs de software 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 do 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 reside na partição
do fornecedor. Quando o processo de serviço de codec do fornecedor é iniciado, ele pode 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 NDK estáveis e não 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 em C++
em frameworks/av/include/media/MediaExtractorPluginHelper.h
. Como o Android
10 ou mais recente oferece suporte apenas à versão mais recente da
API extractor, crie o modelo do extrator com base no extrator com o
maior número de versão da API.
Coloque extratores personalizados em /system/lib/64/extractors
ou em um APEX do fornecedor,
que é aberto junto com o APEX do Google que contém os extratores do Google. Para
verificar se o framework carregou seu extrator, execute o seguinte comando.
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á é aceito por um extrator fornecido pelo Google, force o framework a usar seu extrator usando a função Sniff()
para retornar um nível de confiança maior do que o fornecido pelo Google.
Quando a estrutura de mídia carrega seu extrator (de /system/lib/64/extractors
ou de um APEX do fornecedor), ela reconhece o arquivo e recebe informações sobre o
conteúdo dele. A próxima etapa é adicionar um decodificador para o formato para 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. Exemplo:
Para adicionar suporte à estrutura de mídia para arquivos AVI que contêm MP3, você precisa de um extrator de AVI, mas não 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 de AVI e um decodificador do Windows Media.
Adicionar um novo decodificador é semelhante a adicionar seus próprios decodificadores de hardware para AVC ou HEVC.
Embora o extrator publique o tipo MIME das faixas de mídia que ele
contém, os codecs que oferecem suporte a esses tipos MIME precisam estar presentes para que o
arquivo seja totalmente compatível. A string de 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 scanner de mídia
O scanner de mídia procura novos tipos de arquivos e os adiciona ao banco de dados de mídia.
Para que o scanner 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 de MIME para extensão. Antes, esse mapeamento era processado no arquivo MediaFile.java
, que ainda contém um mapeamento de tipo MIME para constantes de formato MTP.
Um extrator pode exportar uma lista de extensões de nome de arquivo compatíveis (como MP3 ou MP4). No entanto, apenas o LegacyMediaScanner
usa isso. Não há efeito no ModernMediaScanner
, que é usado por padrão.