2013-03-06 132 views
0

AudioRecord缓冲为什么低于audioDatashort[]缓冲区我在代码中创建在每个填充零

samplesIn += mRecordInstance.read(audioData, samplesIn, bufferSize - samplesIn); 

充满0

缓冲区的大小(audioData.length)不为零,这意味着缓冲区不是空的,它只是填充了零。

我试过将FREQUENCY更改为8000 - >没有改变。

我正在实施Echoprint库 - 请refer to this欲了解更多有关这方面的信息,如果您需要它。从logcat的

证明了audioData缓冲区填充零:

// ... 
public final static int LISTENING_PASS_TIME = 20; 
// cap to 30 seconds max, 10 seconds min. 
public final static int MAX_LISTENING_PASS_TIME = 30; 
public final static int MIN_LISTENING_PASS_TIME = 10; 

private final int FREQUENCY = 11025; 
private final int CHANNEL = AudioFormat.CHANNEL_IN_MONO; 
private final int ENCODING = AudioFormat.ENCODING_PCM_16BIT;  

private Thread thread; 
private volatile boolean isRunning = false; 
AudioRecord mRecordInstance = null; 

private short audioData[]; 
private int bufferSize; 
private int secondsToRecord; 
private volatile boolean continuous; 

public void stop() { 
    this.continuous = false; 
    if (mRecordInstance != null) 
     mRecordInstance.stop();  
} 

public void run() { 
    this.isRunning = true; 
    try { 
     // create the audio buffer & get the minimum buffer size 
     int minBufferSize = AudioRecord.getMinBufferSize(FREQUENCY, 
       CHANNEL, ENCODING); 
     Log.d("Fingerprinter", "minBufferSize: " + minBufferSize); 

     // and the actual buffer size for the audio to record frequency * 
     // seconds to record. 
     bufferSize = Math.max(minBufferSize, this.FREQUENCY 
       * this.secondsToRecord); 
     Log.d("Fingerprinter", "bufferSize: " + bufferSize); 

     audioData = new short[bufferSize]; 

     // start recorder 
     mRecordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 
       FREQUENCY, CHANNEL, ENCODING, minBufferSize); 

     // start recording 
     willStartListening(); 

     mRecordInstance.startRecording(); 
     boolean firstRun = true; 
     do { 
      try { 
       willStartListeningPass(); 

       long time = System.currentTimeMillis(); 
       // fill audio buffer with mic data. 
       int samplesIn = 0; 
       do { 
        samplesIn += mRecordInstance.read(audioData, samplesIn, 
          bufferSize - samplesIn); 

        if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) 
         break; 
       } while (samplesIn < bufferSize); 
       Log.d("Fingerprinter", 
         "Audio recorded: " 
           + (System.currentTimeMillis() - time) 
           + " millis"); 

       // see if the process was stopped. 
       if (mRecordInstance.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED 
         || (!firstRun && !this.continuous)) 
        break; 

       // debugging: print audioData short[] 
       Log.d("Fingerprinter", "Audio Data Content:"); 

       // String audioDataContent = ""; 
       for (int i = 100; i < 110; i++) { 
        // audioDataContent = i + ":" + audioData[i]; 
        Log.d("Fingerprinter", i + ":" + audioData[i]); 
       } 

       Log.d("Fingerprinter", "samplesIn: " + samplesIn); 

       firstRun = false; 

       didFinishListeningPass(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.e("Fingerprinter", e.getLocalizedMessage()); 

       didFailWithException(e); 
      } 
     } while (this.continuous); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e("Fingerprinter", e.getLocalizedMessage()); 

     didFailWithException(e); 
    } 

    if (mRecordInstance != null) { 
     mRecordInstance.stop(); 
     mRecordInstance.release(); 
     mRecordInstance = null; 
    } 
    this.isRunning = false; 

    didFinishListening(); 
} 

回答

0

我发现,我其实记录做了一些数据 - 这只是我选择显示,只有部分录制为zeros。我通过汇总audioData数组中的所有条目并将其除以数组中的条目数来证明这一点。结果是-3.455619047619048