AudioRecord: Непрерывно записывайте аудиоданные и одновременно анализируйте их.

Я пытаюсь использовать объект AudioRecord в Android для записи аудиоданных в массив байтов и одновременного выполнения некоторого анализа записанных данных. Но я не уверен, как это сделать. Если я использую массив байтов напрямую, приложение падает. Мне нужен массив байтов в качестве входных данных для анализирующего потока. Я относительно новичок в разработке Android, и я был бы признателен за любую помощь по этой теме. Спасибо

byte[] data;
public void Record()throws IOException{
    int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);
    AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);
    recorder.startRecording();        
    isRecording = true;
    boolean flag = true;
    data = new byte[bufferSize];
    while(isRecording){
        try {               
            int result = recorder.read(data, 0, bufferSize);                
            if(flag){
                Thread analyseThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        theAnalysingFunction();
                    }
                },"AudioRecorder Thread");
                analyseThread.start();
                flag=false;
            }
            if (AudioRecord.ERROR_INVALID_OPERATION !=result ) {

            } else if (result == AudioRecord.ERROR_INVALID_OPERATION) {
                Log.e("Recording", "Invalid operation error");
                break;
            } else if (result == AudioRecord.ERROR_BAD_VALUE) {
                Log.e("Recording", "Bad value error");
                break;
            } else if (result == AudioRecord.ERROR) {
                Log.e("Recording", "Unknown error");
                break;
            }
        } catch (Exception e) {
            Log.i("Error", "AudioRecord error");

        }
    }       
}
public void theAnalysingFunction(){
    //
    //Analyse the byte array named data
    //
}

person user1396160    schedule 13.11.2014    source источник


Ответы (1)


Это многопоточность. Вы пытаетесь проанализировать буфер. В то время как другой поток изменяет его одновременно.

Что касается вашего сбоя, если вы используете байтовый буфер, убедитесь, что вы используете ENCODING_PCM_8BIT для кодирования.

person O_Z    schedule 31.03.2015