AudioRecord – archivo PCM de escritura
Estoy tratando de grabar algo de voz utilizando la clase AudioRecord y luego escribirla para que salga al archivo .pcm. Quiero que mi programa continúe grabando hasta que se presione el botón de parada. Desafortunadamente, no importa cuánto tiempo estoy grabando, el tamaño del archivo de salida es siempre de 3528 bytes y dura unos 20 ms. También según Toolsoft Audio Tools, las propiedades de ese archivo son: 44100Hz, 16 bits, estéreo, incluso si estoy usando mono con frecuencia de muestreo completamente diferente.
Thread recordingThread; boolean isRecording = false; int audioSource = AudioSource.MIC; int sampleRateInHz = 44100; int channelConfig = AudioFormat.CHANNEL_IN_MONO; int audioFormat = AudioFormat.ENCODING_PCM_16BIT; int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); byte Data[] = new byte[bufferSizeInBytes]; AudioRecord audioRecorder = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void startRecording(View arg0) { audioRecorder.startRecording(); isRecording = true; recordingThread = new Thread(new Runnable() { public void run() { String filepath = Environment.getExternalStorageDirectory().getPath(); FileOutputStream os = null; try { os = new FileOutputStream(filepath+"/record.pcm"); } catch (FileNotFoundException e) { e.printStackTrace(); } while(isRecording) { audioRecorder.read(Data, 0, Data.length); try { os.write(Data, 0, bufferSizeInBytes); } catch (IOException e) { e.printStackTrace(); } try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } }); recordingThread.start(); } public void stopRecording(View arg0) { if (null != audioRecorder) { isRecording = false; audioRecorder.stop(); audioRecorder.release(); audioRecorder = null; recordingThread = null; } }
¿Puedo pedirle que me diga lo que está mal? Espero que la respuesta no sea 'todo' 🙂
- Android AudioRecord clase - proceso de mic audio en vivo rápidamente, configurar la función de devolución de llamada
- No se puede acceder al micrófono cuando otra aplicación lo está utilizando en Android
- AudioRecord y AudioTrack latency
- AudioRecord: registros de "Overrun user" - ¿qué significan?
- Android Emulator parece grabar audio a 96kHz
- Android AudioRecord leer siempre devuelve -3 (ERROR_INVALID_OPERATION)
- FFT de audio Android para recuperar la magnitud de frecuencia específica mediante audiorecord
- ¿Por qué recibiría NPE en este estado?
- Mala calidad de sonido al grabar / reproducir sonidos - SDK de Android
- Android detecta AudioRecord / maneras de grabar audio sin bloquear otras aplicaciones
- Cambiar registro de audio de Android Fuente de entrada predeterminada
- AudioRecord registra sonido intermitente en Android L Vista previa del desarrollador
- Entrada y salida de audio inmediatas Android
Change your sample rate to 8000
, porque en el emulador no cant test with 44100 sample rate.
Utilice la fuente AudioRecord
como se muestra para jugar en el emulador
private static final int RECORDER_SAMPLERATE = 8000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; AudioRecord audio_record = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement); int BufferElements2Play = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024 int BytesPerElement = 2; // 2 bytes in 16bit format
Si no se trabaja, entonces ve a este blog. Funcionará bien para grabar y almacenar los datos en el archivo .pcm
.
try { os.write(Data, 0, bufferSizeInBytes); } catch (IOException e) { e.printStackTrace(); } try { os.close(); } catch (IOException e) { e.printStackTrace(); }
Este es el problema. Usted está cerrando el FileOutputStream (os.close ()) después de sólo una sola escritura. Moverlo fuera del bucle while:
while(isRecording) { audioRecorder.read(Data, 0, Data.length); try { os.write(Data, 0, bufferSizeInBytes); } catch (IOException e) { e.printStackTrace(); } } try { os.close(); } catch (IOException e) { e.printStackTrace(); } }
- Android InApp facturación envoltura?
- El teclado no se cierra tras volver del cliente de correo electrónico