2013-03-06 129 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