Android Opensles Buffer Starvation Problema
Pergunta
Estou tentando trabalhar em torno do seguinte problema no Android Opens.
O OPENSLE SPEC diz o seguinte:
.http://www.khronos.org/registry/sles/ Especificações / opensl_es_specification_1.0.1.pdf - 8.12
Quando o player estiver no estado sl_playstate_playing, que é controlado pela interface SlPlayitf [ver seção 8.32], adicionando Os buffers começarão implicitamente a reprodução. No caso de fome devido Para buffers insuficientes na fila, o jogo de dados de áudio pára. O jogador permanece no estado sl_playstate_playing. Após a fila de. Buffers adicionais, o jogo de dados de áudio é retomado. Observe que A fome de buffers enfileirados causa lacunas audíveis nos dados de áudio Stream. No caso em que o jogador não está no estado de jogo, A adição de buffers não inicia a reprodução de áudio.
alas uma vez chegarmos ao Android:
.http://mobilepearls.com/labs/ nativo-Android-api / ndk / docs / openles / index.html - decodificar áudio para pcm
Dependendo da implementação da plataforma, a decodificação pode exigir recursos que não podem ser ociosos. Portanto, não é recomendado fome o decodificador, deixando de fornecer um número suficiente de Buffers PCM, e. Ao retornar da fila de buffer simples Android retorno de chamada sem enqueuing outro buffer vazio. O resultado de A fome decodificadora não é especificada; A implementação pode optar por largar os dados do PCM decodificados, pause o processo de decodificação ou em Casos graves terminam o decodificador.
Este comportamento não específico parou completamente o progresso no meu projeto e estou perdido como melhor para contornar. Decodificação O arquivo inteiro para PCM na memória ou no disco não é uma opção, eu realmente preciso que isso seja uma solução de streaming. Qualquer ajuda disso seria massivamente apreciada
Solução
Não parece ser uma maneira de contornar esse problema.Outros projetos parecem usar as APIs de nível inferior (como a libstagefright) para fazer sua decomposição.Esse método permite que você receba nos dados
[editar] Não há uma maneira de contornar a questão da fome.Android simplesmente não adere à especificação.Basicamente você precisa buffer na memória e certifique-se de usar pausa e retomar para decodificar quando você precisa controlar o fluxo dos dados.