Ошибки при записи звука в Android - PullRequest
4 голосов
/ 23 января 2012

Я создал приложение, которое записывает звук и анализирует его по частоте.Этот процесс повторяется пару раз каждую секунду и, таким образом, использует многопоточность.

Это работает большую часть времени, но по какой-то причине в logcat эти сообщения повторяются после первого анализа.

Редко (но иногда), когда я тестирую, записи приложения нетзвук.Так что я думаю, что это как-то связано с этой ошибкой.

01-23 13:52:03.414: E/AudioRecord(3647): Could not get audio input for record source 1
01-23 13:52:03.424: E/AudioRecord-JNI(3647): Error creating AudioRecord instance: initialization check failed.
01-23 13:52:03.424: E/AudioRecord-Java(3647): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.

Код приведен ниже, у кого-нибудь есть идеи, где я ошибаюсь?Я не убиваю объект AudioRecord правильно?Код был изменен для удобства чтения:

public class recorderThread extends AsyncTask<Sprite, Void, Integer> {

short[] audioData;
int bufferSize; 

@Override
protected Integer doInBackground(Sprite... ball) {

        boolean recorded = false; 
        int sampleRate = 8192;  
        AudioRecord recorder = instatiateRecorder(sampleRate);


        while (!recorded) {  //loop until recording is running

        if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED) // check to see if the recorder has initialized yet.
        {
            if (recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)
                  recorder.startRecording();  
//check to see if the Recorder has stopped or is not recording, and make it record.                               
            else {             
            //read the PCM audio data into the audioData array

              //get frequency
                //checks if correct frequency, assigns number
               int correctNo = correctNumber(frequency, note);

               checkIfMultipleNotes(correctNo, max_index, frequency, sampleRate, magnitude, note);

               if (audioDataIsNotEmpty())
                   recorded = true;

                   return correctNo;
              }
        }
        else
        {
            recorded = false;
            recorder = instatiateRecorder(sampleRate);
        }
    }

        if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING) 
        {
            killRecorder(recorder);
        }

        return 1;
}


private void killRecorder(AudioRecord recorder) {
    recorder.stop(); //stop the recorder before ending the thread
    recorder.release(); //release the recorders resources
    recorder=null; //set the recorder to be garbage collected
}




@Override
protected void onPostExecute(Integer result) {  
    ballComp.hitCorrectNote = result;    
}

private AudioRecord instatiateRecorder(int sampleRate) {    
        bufferSize= AudioRecord.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT)*2; 
//get the buffer size to use with this audio record

        AudioRecord recorder = new AudioRecord (AudioSource.MIC,sampleRate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT,bufferSize); 
//instantiate the AudioRecorder

        audioData = new short [bufferSize];
 //short array that pcm data is put into.        
        return recorder;
}
}

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Поскольку ваш журнал говорит, что "Не удалось получить аудиовход для источника записи 1", это означает.Android-устройству не найдено никакого оборудования для записи звука.

Итак. Если вы тестируете приложение из эмулятора, убедитесь, что вы успешно подключили мышь во время записи звука или если вы отлаживаете или запускаете его изЗатем устройство убедитесь, что микрофон включен для записи звука.

Надеюсь, он вам поможет.

Или

Если приведенное выше не помогло решить проблему, воспользуйтесь приведенным ниже.код для записи звука, так как он идеально подходит для меня.

код:

  record.setOnClickListener(new View.OnClickListener() 
    {
        boolean mStartRecording = true;
        public void onClick(View v) 
        {

                if (mStartRecording==true) 
                {
                    //startRecording();
                    haveStartRecord=true;
                    String recordWord = wordValue.getText().toString();
                    String file = Environment.getExternalStorageDirectory().getAbsolutePath();
                    file = file+"/"+recordWord+".3gp";

                    System.out.println("Recording Start");
                    //record.setText("Stop recording");
                    record.setBackgroundDrawable(getResources().getDrawable( R.drawable.rec_on));
                    mRecorder = new MediaRecorder();
                    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
                    mRecorder.setOutputFile(file);
                    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

// mRecorder.setAudioChannels (1);// mRecorder.setAudioSamplingRate (8000);

                    try 
                    {
                        mRecorder.prepare();
                    }
                    catch (IOException e) 
                    {
                        Log.e(LOG_TAG, "prepare() failed");
                    }

                    mRecorder.start();

                }

                else
                {
                    //stopRecording();
                    System.out.println("Recording Stop");
                    record.setBackgroundDrawable(getResources().getDrawable( R.drawable.rec_off));
                    mRecorder.stop();
                    mRecorder.release();
                    mRecorder = null;
                    haveFinishRecord=true;

                }
                mStartRecording = !mStartRecording;

        }
    });

Надеюсь, этот ответ поможет вам.

Наслаждайтесь.:)

1 голос
/ 13 декабря 2013

У меня была такая же проблема.И я решил это, добавив

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

в "AndroidManifest.xml"

1 голос
/ 26 января 2012

Что мешает запускать два RecorderThreads одновременно? Покажите код, который создает экземпляр одного из этих объектов, выполняет его и, конечно, ждет, пока любой предыдущий RecorderThread завершит работу первым.

Если ответ таков: ничто останавливает одновременное выполнение двух записей RecorderThreads, тогда использование «static» будет, очевидно, проблемой ... второй поток вызовет утечку первой AudioRecord пока открыт. ИМХО, это хорошая идея, чтобы попытаться избежать использования статических данных.

...