Decodificação de vídeo acelerada por hardware para H.264 no Android antes do Jelly Bean
-
21-12-2019 - |
Pergunta
Estou trabalhando em um projeto de videoconferência.Estávamos usando um codec de software para codificar e decodificar quadros de vídeo, o que funcionará bem para resoluções mais baixas (até 320p).Planejamos oferecer suporte ao nosso aplicativo para resoluções mais altas também de até 720p.Fiquei sabendo que a aceleração de hardware fará esse trabalho muito bem.
Como o codec de hardware api Media codec está disponível a partir do Jelly Bean, usei-o para codificar e decodificar e está funcionando bem.Mas meu aplicativo é compatível com 2.3.Portanto, preciso de uma decodificação de vídeo acelerada por hardware para quadros H.264 de 720p a 30fps.
Na pesquisa, me deparei com a ideia de usar o codec OMX modificando a estrutura do stage fright. Eu tinha lido que o decodificador de hardware para H.264 está disponível a partir de 2.1 e o codificador está disponível a partir de 3.0.Li muitos artigos e perguntas feitas neste site e confirmei que posso seguir em frente.
Eu tinha lido sobre arquitetura do medo do palco aqui -arquitetura e aqui- stagefright como funciona
E eu li sobre o codec OMX aqui- use-android-hardware-decoder-with-omxcodec-in-ndk.
Estou tendo problemas iniciais e algumas confusões na sua implementação. Gostaria de ter algumas informações sobre isso.
- Para usar o codec OMX em meu código, devo construir meu projeto com toda a árvore de origem do Android ou posso fazer isso adicionando alguns arquivos da fonte AOSP (se sim, quais todos).
- Quais são os passos do zero que devo seguir para alcançá-lo.
Alguém pode me dar uma orientação sobre isso
Obrigado...
Solução
O melhor exemplo para descrever a integração de OMXCodec
na camada nativa está o utilitário de linha de comando stagefright
como pode ser observado aqui em GingerBread
em si.Este exemplo mostra como um OMXCodec
é criado.
Alguns pontos a serem observados:
A entrada para
OMXCodec
deve ser modelado como umMediaSource
e, portanto, você deve garantir que seu aplicativo atenda a esse requisito.Um exemplo para criar umMediaSource
fonte baseada pode ser encontrada emrecord
arquivo utilitário comoDummySource
.A entrada para o decodificador, ou seja,
MediaSource
deverá fornecer os dados através doread
método e, portanto, seu aplicativo deve fornecer quadros individuais para cadaread
chamar.O decodificador pode ser criado com
NativeWindow
para alocação de buffer de saída.Neste caso, se você deseja acessar o buffer da CPU, você provavelmente deve consultar esta consulta para mais detalhes.