在Android中录制声音时出错

时间:2012-01-23 14:04:19

标签: java android android-asynctask audiorecord

我制作了一款可以录制声音的应用,并根据频率进行分析。该过程每秒重复几次,因此使用线程。

这在大多数情况下都有效,但出于某种原因,在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 个答案:

答案 0 :(得分:2)

正如您的日志所说“无法获取记录源1的音频输入”那意味着。 Android设备未找到任何用于录制声音的硬件。

因此,如果您正在测试Emulator中的应用程序,请确保在录制声音期间已成功连接鼠标,或者如果您正在从设备调试或运行它,请确保Mic已打开以录制声音

希望它会对你有所帮助。

如果上面没有解决您的问题,请使用以下代码录制声音,因为它对我来说非常适合。

代码:

  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 :(得分:1)

什么阻止你同时运行两个RecorderThreads?显示实例化其中一个对象的代码,执行它,当然还要等待任何先前的RecorderThread先完成。

如果答案是没有同时停止两个RecorderThreads运行,那么你使用'static'显然会出现问题......第二个线程将导致第一个AudioRecord成为打开时泄露。恕我直言,尽量避免使用静态数据。

答案 2 :(得分:1)

我遇到了同样的问题。我通过添加

解决了这个问题
"<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>"

到“AndroidManifest.xml”