【问题标题】:Android audiorecord instance failsAndroid audiorecord 实例失败
【发布时间】:2012-01-04 05:11:46
【问题描述】:

我正在创建一个应用程序来检测通过麦克风播放的声音频率。 分析在 AsyncTask 中完成。当我尝试一个音符时它会起作用。

但是,当我尝试分析来自不同吉他弦的 6 个音符时,一个接一个(中间有大约一秒钟的延迟),它可能只会再捕获一个。

这是我得到的一些 LogCat 输出:

11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=-1
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [SKW]do_route_audio_rpc(0, 1, 0)
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): msm72xx_enable_audpp: 0x0000
11-22 19:50:04.333: ERROR/AudioHardwareMSM72XX(1296): [doRouting]sndDevice=0,mCurSndDevice=0
11-22 19:50:30.523: ERROR/AudioHardwareMSM72XX(1296): Cannot open /dev/msm_pcm_in errno: 16
11-22 19:50:30.533: ERROR/AudioRecord(23241): Could not get audio input for record source 1
11-22 19:50:30.533: ERROR/AudioRecord-JNI(23241): Error creating AudioRecord instance: initialization check failed.
11-22 19:50:30.533: ERROR/AudioRecord-Java(23241): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.

我删除了所有重复的内容。

这是我班的主要内容:

static AudioRecord recorder;
static short[] audioData;
static int bufferSize;
static int samplerate = 8000;         
static boolean recorded = false;

@Override
protected Integer doInBackground(params) {

bufferSize= AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT)*2; 

recorder = new AudioRecord (AudioSource.MIC,samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

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

    int recordingLoops = 0;
    while (recordingLoops < 4 || recorded) {  //loop until recording is running

    if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED)
        if(recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)
              recorder.startRecording();                     
        else {         
           recorder.read(audioData,0,bufferSize); 

           getFrequencyFromAudiodata(audioData);

           recorded = true;
             }        
    recordingLoops++;  
}

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

    return 1;
}

你们知道发生了什么吗?我环顾四周,但我似乎只是遇到有人说 Android 是“充满错误”。

任何帮助将不胜感激。

谢谢,本

【问题讨论】:

    标签: android android-asynctask fft logcat audiorecord


    【解决方案1】:

    答案在于:

    while (recordingLoops < 4 || recorded) 
    

    我改成:

    while (!recorded) 
    

    并且仅当音频数据数组被充分填充时才将 recorder 设置为 true。 这意味着它将循环直到完美。感谢您的帮助,戴夫!

    【讨论】:

      【解决方案2】:

      您可能会看这个答案,看起来处理与 AudioRecord 相关的线程时有些想法:

      Android AudioRecord class - process live mic audio quickly, set up callback function

      【讨论】:

      • 它似乎没有解决我的记录器没有实例化的问题。知道是什么原因造成的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多