Você pode estender os componentes do extrator de mídia e do codec de mídia usando o
extensões. 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, você precisa criar um Extrator e um Decodificador 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, você pode configurar serviços personalizados de codec de mídia que usem o Codec 2.0
interface definida em frameworks/av/media/codec2/core/
. Para um modelo
implementação, consulte frameworks/av/media/codec2/hidl/services/
. A
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 que o 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
APIs NDK estáveis e não depende de APIs privadas. Os extratores devem
implementar a API definida pelo
frameworks/av/include/media/MediaExtractorPluginApi.h
e podem usar a biblioteca C++
wrappers de conveniência
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 no /system/lib/64/extractors
ou em um APEX de fornecedor.
que é aberto junto 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ê verá 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á é 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 o extrator (de /system/lib/64/extractors
)
ou de um APEX de fornecedor), ele reconhece o arquivo e consegue informações sobre seu
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 a estrutura de mídia para arquivos AVI contendo o Windows Media, você precisará 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.
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 do tipo MIME real utilizada é estritamente um
concordância entre o extrator e o codec (a string não precisa ser
adicionados 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 scanner de mídia lide com seu tipo de arquivo personalizado, ele precisa
e saber mais sobre ele. No Android 10 ou mais recente, MimeUtils
(em
libcore
) mantém o mapeamento de MIME para extensão. Antes, esse mapeamento era
processada no arquivo MediaFile.java
, que continua a conter 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.