voz una tiempo samsung real que pasar para notas las guardan grabación grabaciones grabacion estan escuchar donde computadora como carpeta app android audio real-time record audio-recording

android - una - escuchar grabación de voz



Reproducción de sonido proveniente del micrófono en tiempo real (3)

Se arroja una java.lang.IllegalStateException con el motivo causado por "play () llamado en un AudioTrack no inicializado".

Es porque el tamaño del búfer es demasiado pequeño. Intenté con "bufferSize + = 2048;", está bien entonces.

He intentado hacer que mi aplicación grabe el sonido procedente del micrófono y lo reproduzca (aproximadamente) en tiempo real, aunque sin éxito.

Estoy usando las clases AudioRecord y AudioTrack para grabar y reproducir, respectivamente. He intentado diferentes enfoques, he intentado grabar el sonido entrante y escribirlo en un archivo y funcionó bien. También intenté reproducir el sonido de ese archivo DESPUÉS con AudioTrack y funcionó bien también. El problema es cuando trato de reproducir el sonido en tiempo real, en lugar de leer un archivo después de que está escrito.

Aquí está el código:

//variables 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.startRecording(); 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);

Se arroja una java.lang.IllegalStateException con el motivo causado por "play () llamado en un AudioTrack no inicializado".

Sin embargo, si cambio la inicialización de AudioTrack, por ejemplo, para usar una frecuencia de muestreo de 8000Hz y un formato de muestra de 8 bits (en lugar de 16), ya no lanza la excepción y la aplicación se ejecuta, aunque produce un ruido horrible.

Cuando reproduzco AudioTrack desde un archivo, no hay ningún problema con la inicialización de AudioTrack, probé 44100 y 16 bits y funcionó correctamente, produciendo el sonido correcto.

Alguna ayuda ?


Todo el audio nativo de Android está encoded . Solo puede reproducir formatos PCM en tiempo real, o usar un códec de streaming especial, que no creo que sea trivial en Android.

El punto es que si quieres grabar / reproducir audio simultáneamente, deberías crear tu propio búfer de audio y almacenar muestras de audio con codificación PCM en bruto allí (no estoy seguro de si estás pensando en ello o si esto está por todas partes, así que trataré de ser claro pero no masticar tu propia goma de mascar).

PCM es una representación digital de una señal analógica en la que sus samples audio son un conjunto de "instantáneas" de la onda acústica original. Debido a que todo tipo de matemáticos e ingenieros inteligentes vieron el potencial de tratar de reducir el número de bits con los que se representan estos datos, se les ocurrió todo tipo de encoders . La señal codificada (comprimida) se representa de forma muy diferente a la señal PCM en bruto y tiene que decodificarse (encriptar -er + dec -oder = codec ). A menos que esté utilizando algoritmos especiales y códecs de transmisión multimedia, es imposible reproducir una señal codificada como la que está intentando, porque no está codificada muestra por muestra, sino más bien fotograma a fotograma, donde necesita el marco completo de las muestras, si no la señal completa, para decodificar este marco.

La forma de hacerlo es almacenar manualmente las muestras de audio provenientes del buffer del micrófono y alimentarlas manualmente al buffer de salida. Tendrás que hacer algunos códigos para eso, pero creo que hay algunas aplicaciones de código abierto que puedes mirar y aprovechar su origen (a menos que estés dispuesto a vender tu aplicación más adelante, por supuesto, pero eso es una discusión completamente diferente).

Si está desarrollando para Android 2.3 o posterior y no tiene demasiado miedo de programar en código nativo , puede intentar usar OpenSL ES . Las características específicas de Android de OpenSL ES se enumeran here . Esta plataforma le permite una manipulación de audio algo más flexible y puede encontrar justo lo que necesita, si su aplicación dependerá en gran medida del procesamiento de audio.


Tuve un problema similar y lo resolví agregando este permiso al archivo de manifiesto:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>