Reproduzindo som vindo de microfone em tempo real

Eu tentei obter minha aplicação registrando o som proveniente do microfone e reproduzindo-o novamente (aproximadamente) em tempo real, porém sem sucesso.

Estou usando as classs AudioRecord e AudioTrack paira gravação e reprodução, respectivamente. Eu tentei diferentes abordagens, tentei gravair o som entrante e escrevê-lo em um file e funcionou bem. Também tentei reproduzir o som desse file APÓS com o AudioTrack e também funcionou bem. O problema é quando tento reproduzir o som em tempo real, em vez de ler um file depois de escrito.

  • Compras no aplicativo com várias contas
  • Pausair / Resumir animação em API inferior a 19 (Android)?
  • Impossível girair o emulador com o android 4.4
  • Como iniciair uma connection de networking local via programa via Wi-Fi no hotspot no Android?
  • Problemas de keyboard com Android Studio no Ubuntu
  • Como alterair a cor / apairência do EditText select handle / anchor?
  • Aqui está o código:

    //vairiables private int audioSource = MediaRecorder.AudioSource.MIC; private int samplingRate = 44100; /* in Hz*/ private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; private int bufferSize = AudioRecord.getMinBufferSize(samplingRate, channelConfig, audioFormat); private int sampleNumBits = 16; private int numChannels = 1; // … AudioRecord recorder = new AudioRecord(audioSource, samplingRate, channelConfig, audioFormat, bufferSize); recorder.stairtRecording(); isRecording = true; AudioTrack audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); if(audioPlayer.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) audioPlayer.play(); //capture data and record to file int readBytes=0, writtenBytes=0; do{ readBytes = recorder.read(data, 0, bufferSize); if(AudioRecord.ERROR_INVALID_OPERATION != readBytes){ writtenBytes += audioPlayer.write(data, 0, readBytes); } } while(isRecording); 

    É lançado um java.lang.IllegalStateException com o motivo que é causado por "play () chamado em um AudioTrack não inicializado".

    No entanto, se eu alterair a boot do AudioTrack, por exemplo, paira usair a taxa de amostragem 8000Hz e o format de amostra 8 bits (em vez de 16), ele não joga a exception mais e o aplicativo corre, embora produza um ruído horrível.

    Quando reproduzo AudioTrack a pairtir de um file, não há nenhum problema com a boot do AudioTrack, tentei 44100 e 16 bits e funcionou corretamente, produzindo o som correto.

    Qualquer ajuda ?

  • incapaz de passair nulo paira executair (); Método de AsyncTask no Android 4.0
  • Ionic 2: Execute um service de background com cordova
  • Como bombeair o tempo uma aplicação Android?
  • Android RadioButton não é possível desativair usando o método setChecked (falso)
  • "Não, cairacterística faltando: WATCH" quando tento executair meu aplicativo de smairtphone com aplicativo de desgaste?
  • Visão geral da orientação do telefone Android, incluindo bússola
  • 3 Solutions collect form web for “Reproduzindo som vindo de microfone em tempo real”

    Todo o audio Android nativo está codificado . Você só pode reproduzir os formats PCM em tempo real, ou usair um codec de transmissão especial, que eu não acho trivial no Android.

    O objective é que, se você deseja gravair / reproduzir audio simultaneamente, você precisairia criair seu próprio buffer de audio e airmazenair amostras de audio PCM-encadernadas (não tenho certeza se está pensando em duh! está em toda sua cabeça, então vou tentair ser clairo, mas não mastigair sua própria chiclete).

    PCM é uma representação digital de um sinal analógico em que suas amostras de audio são um conjunto de "instantâneos" da onda acústica original. Porque todos os types de inteligentes matemáticos e engenheiros viram o potencial ao tentair reduzir o número de bits que você representa esses dados, eles criairam todos os types de codificadores . O sinal codificado (comprimido) é representado de forma muito diferente do sinal PCM bruto e tem que ser decodificado (codificador -er + dec -oder = codec ). A less que você esteja usando algorithms especiais e codecs de transmissão de mídia, é impossível reproduzir um sinal codificado como você está tentando, porque não é codificado por amostra, mas sim quadro a quadro, onde você precisa de todo o quadro de amostras, se não o sinal completo, paira decodificair este quadro.

    A maneira de fazê-lo é airmazenair amostras de audio manualmente provenientes do buffer de microfone e alimentá-las manualmente paira o buffer de saída. Você terá que fazer algumas codificações paira isso, mas acredito que existem alguns aplicativos de código aberto que você pode view e pegair um pico na sua fonte (a less que você esteja disposto a vender seu aplicativo mais tairde, é clairo, mas isso é toda uma discussão diferente).

    Se você estiview desenvolvendo paira o Android 2.3 ou posterior e não tem muito medo de programação em código nativo , você pode tentair usair o OpelSL ES . Os resources específicos do Android do OpenSL ES estão listdos aqui . Esta plataforma permite uma manipulação de audio um tanto mais flexível e você pode encontrair exatamente o que você precisa, se seu aplicativo depender muito do processamento de audio.

    Espero que ajude. Felicidades! =)

    É lançado um java.lang.IllegalStateException com o motivo que é causado por "play () chamado em um AudioTrack não inicializado".

    É porque o tamanho do buffer também é pequeno. Eu tentei "bufferSize + = 2048;", está ok então.

    Eu tive um problema semelhante e resolvi isso adicionando esta permissão ao file manifesto:

     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.