Pergunta

Atualmente, tenho um programa de volta para testar o áudio em dispositivos Android.

Ele usa o AudiorCord e o áudio para gravar o áudio PCM do microfone e reproduzir o Audio PCM no fone de ouvido.

Aqui está o código:

public class Record extends Thread
  {

          static final int bufferSize = 200000;
          final short[] buffer = new short[bufferSize];
          short[] readBuffer = new short[bufferSize];

          public void run() {  
            isRecording = true;
            android.os.Process.setThreadPriority
            (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

            int buffersize = AudioRecord.getMinBufferSize(11025,
            AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

                           arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize);

                           atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
                                           11025,
                                           AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                           AudioFormat.ENCODING_PCM_16BIT,
                                           buffersize,
                                           AudioTrack.MODE_STREAM);


                           atrack.setPlaybackRate(11025);

                           byte[] buffer = new byte[buffersize];
                           arec.startRecording();
                           atrack.play();

                           while(isRecording) {

                                   arec.read(buffer, 0, buffersize);
                                   atrack.write(buffer, 0, buffer.length);
                           }  
          }
  }

Portanto, como você pode ver na criação do áudio e do AudiorCord, a codificação é fornecida através do AudioFormat, mas isso permite apenas PCM de 16 ou 8 bits.

Eu tenho minha própria implementação do codec G711 agora e quero poder codificar o áudio do microfone e decodificá -lo no fone de ouvido, então eu tenho Encode (lin curto [], int offset, byte ENC [], INT quadros) e Decode (byte ENC [], LIN Short [], Int Frames) Métodos, mas não tenho certeza de como usá -los para codificar e decodificar o áudio do AudiorCord e do áudio.

Alguém pode me ajudar ou me apontar na direção certa?

Foi útil?

Solução

Mudar seu arec.read(buffer, 0, buffersize) Ligue para usar o Bytebuffer read() método de AudioRecord.

Depois de ter seus bytes no ByteBuffer Objeto, você pode apenas inserir sua chamada de implementação do G711 de codificar e usar o ByteBuffer.asShortBuffer() Método para colocar seus dados PCM capturados no codificador.

Isso resolveria sua pergunta inicial sem precisar apresentar uma biblioteca de terceiros para fazer esse trabalho para você. (Esta resposta é para futuras pessoas que se deparam com a pergunta).

Minha pergunta é por quê?

No seu código acima, você captura dados do PCM do microfone e escreva -os diretamente no buffer para reprodução.

Não faz sentido em sua implementação seguir o caminho do PCM -> G711 (Encode) -> G711 (decodificar) -> PCM. Tudo o que você está fazendo é introduzir processamento e latência desnecessários. Agora, se você fosse escrever dados codificados em um arquivo, em vez de tentar reproduzi -los através da peça de ouvido que seria uma história diferente, mas seu código atual não parece realmente útil para codificar os dados do PCM.

A introdução do seu próprio codec aqui só faria sentido no contexto de gravar os dados de voz compactados em um arquivo (gravar dados de chamadas, por exemplo, de maneira compactada) ou enviá -los pela rede ou algo assim.

Outras dicas

Sei que este é um post bastante antigo. Você conseguiu fazer seu próprio G711 funcionar? Meu próprio pensamento inicial seria usar um Lib compilado para o kernel e usar o JNI para chamá -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top