O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Personalização de componentes de mídia

Você pode estender o extrator de mídia e os componentes do codec de mídia usando extensões do fornecedor. As APIs MediaSession2 e MediaParser não podem ser personalizadas (mas você pode MediaSession alterações para as APIs MediaPlayer e MediaSession ).

Para oferecer suporte a tipos de mídia adicionais na estrutura de mídia Android, você precisa criar um extrator e decodificador personalizados. Por exemplo, para adicionar suporte para vídeo do Windows Media em arquivos AVI, você precisa criar um extrator AVI e um decodificador de vídeo do Windows Media.

Sobre extensões

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

Da mesma forma, você pode configurar serviços de codec de mídia personalizados que usam a interface Codec 2.0 definida em frameworks/av/media/codec2/core/ . Para obter uma implementação básica, consulte frameworks/av/media/codec2/hidl/services/ . O ponto de entrada da biblioteca é a interface C2ComponentStore . Para obter um exemplo, consulte a implementação do armazenamento de codecs 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 do serviço mediaswcodec . Para fazer isso, defina uma biblioteca compartilhada de nível superior responsável por registrar todos os componentes C2 e, em seguida, crie um pacote APEX (com dependências transitivas) que resida 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.

Criação de um extrator

Ao adicionar um extrator para um novo formato, certifique-se de que o extrator dependa apenas de APIs NDK estáveis ​​e não dependa de APIs privadas. Os extratores devem 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 10 ou superior oferece suporte apenas à versão mais alta da API do extrator, certifique-se de modelar seu extrator de acordo com o 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 Google APEX que contém os extratores do Google. Para verificar se a estrutura carregou seu extrator, execute o seguinte comando.

adb shell dumpsys media.extractor

Você deve obter 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 seu extrator personalizado oferece suporte a um formato que já é compatível com um 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 mais alto do que aquele fornecido pelo Google.

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

Criação de 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 de estrutura de mídia para arquivos AVI contendo MP3, você precisa de um extrator de AVI, mas não precisa de um decodificador de MP3 porque já existe um.

  • Para adicionar suporte de estrutura de mídia para arquivos AVI contendo Windows Media, você precisa de um extrator AVI e 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 que suportam esses tipos MIME precisam estar presentes para que o arquivo seja totalmente suportado. 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 ).

Integrando com scanner de mídia

O scanner 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 controle seu tipo de arquivo personalizado, o scanner precisa saber sobre isso. No Android 10 ou superior, MimeUtils (em libcore ) mantém o mapeamento de MIME para extensão. Anteriormente, esse mapeamento era tratado 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 suportadas (como MP3 ou MP4). No entanto, apenas LegacyMediaScanner usa isso; não tem efeito no ModernMediaScanner , que é usado por padrão.