繁体   English   中英

在Android中录制声音时出错

[英]Errors when recording sound in Android

我制作了一个记录声音并分析频率的应用程序。 该过程每秒重复几次,因此使用线程。

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

正如您的日志所说“无法获取记录源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;

        }
    });

希望这个答案可以帮到你。

请享用。 :)

我有同样的问题。 我通过添加来解决它

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

到“AndroidManifest.xml”

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM