Classe Android AudioRecord - processe o áudio do microfone ao vivo rapidamente, configure a função de retorno de chamada

Quero gravar o áudio do microfone e acessá-lo para uma possível reprodução quase em tempo real. Não tenho certeza de como usar a classe Android AudioRecord para gravar algum áudio do microfone e acessá-lo rapidamente.

Para a classe AudioRecord, o site oficial diz 'o aplicativo consulta o objeto AudioRecord a tempo' e 'o tamanho do buffer que está sendo preenchido determina o tempo da gravação antes da execução de dados não lidos'. Mais tarde, sugere-se que um buffer maior seja usado ao pesquisar com menos frequência. Na verdade, eles nunca mostram um exemplo no código.

Um exemplo que eu já vi em um livro usa a classe AudioRecord para ler continuamente um buffer preenchido recentemente com áudio ao vivo e, em seguida, o aplicativo grava esses dados em um arquivo SD. O pseudo-código se parece com -

set up AudioRecord object with buffer size and recording format info
set up a file and an output stream
myAudioRecord.startRecording();
while(isRecording)
{
    // myBuffer is being filled with fresh audio
    read audio data into myBuffer
    send contents of myBuffer to SD file
}
myAudioRecord.stop();

Como esse código sincroniza sua leitura com a taxa de gravação não é claro - o "isRecording" booleano é sequenciado e desativado adequadamente em outro local? Parece que esse código pode ser lido com muita frequência ou com pouca frequência, dependendo de quanto tempo a leitura e a escrita levarem.

O documento do site também diz que a classe AudioRecord tem uma classe aninhada chamada OnRecordPositionUpdateListener, que é definida como uma interface. As informações sugerem que, de alguma forma, você especifica o período que deseja ser notificado sobre o andamento da gravação, o nome do seu manipulador de eventos e uma chamada é feita automaticamente para o manipulador de eventos na frequência especificada. Eu acho que a estrutura, no pseudo-código, seria algo como -

set target of period update message = myListener
set period to be about every 250 ms
other code

myListener()
{
    if(record button was recently tapped)
        handle message that another 250 ms of fresh audio is available
        ie, read it and send it somewhere
)

Preciso encontrar um código específico que permita capturar e processar o áudio do microfone com um atraso menor que cerca de 500 ms. O Android oferece outra classe chamada MediaRecorder, mas não suporta streaming, e talvez eu queira transmitir áudio de microfone ao vivo por uma rede Wi-Fi quase em tempo real. Onde posso encontrar alguns exemplos específicos?

questionAnswers(4)

yourAnswerToTheQuestion