2017-08-20 29 views
0

我用AudioRecord编写了一个用于从麦克风接收数据的标准代码。这里是我的代码:AudioRecord在启动后返回一些空数据

AudioReceiver() { 
    int minHardwareBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, 
      CHANNEL_CONFIG, AUDIO_FORMAT); 
    Log.d(TAG, "minHardwareBufferSize = " + minHardwareBufferSize); 
    int bufferSizeBytes = (minHardwareBufferSize > MIN_BUFFER_SIZE_BYTES) ? 
      minHardwareBufferSize : MIN_BUFFER_SIZE_BYTES; 
    bufferSizeShorts = bufferSizeBytes/2; 

    //резервируем буфер с запасом в 2 раза 
    audioRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
      SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSizeBytes * 2); 

    testStack = new short[bufferSizeShorts * 4]; 
    Arrays.fill(testStack, (short) 2000); 
} 


boolean startReceive() { 
    audioRecorder.startRecording(); 
    isReceiving = true; 
    int recordingState = audioRecorder.getRecordingState(); 
    Log.d(TAG, "recordingState = " + recordingState); 
    new Thread(receivingRunnable).start(); 
    return (recordingState == AudioRecord.RECORDSTATE_RECORDING); 
} 


boolean stopReceive() { 
    isReceiving = false; 
    audioRecorder.stop(); 
    int recordingState = audioRecorder.getRecordingState(); 
    Log.d(TAG, "recordingState = " + recordingState); 
    return (recordingState == AudioRecord.RECORDSTATE_STOPPED); 
} 


private Runnable receivingRunnable = new Runnable() { 
    @Override 
    public void run() { 
     int readCount = 0; 
     short[] dataBuffer = new short[bufferSizeShorts]; 
     while (isReceiving) { 
      testBusy = true; 
      for (int j = 0; j < 4; j++) { 
       readCount = audioRecorder.read(dataBuffer, 0, dataBuffer.length); 
       Log.d(TAG, "receive " + readCount + " bytes"); 
       System.arraycopy(dataBuffer, 0, testStack, bufferSizeShorts * j, readCount); 
      } 
      isReceiving = false; 
      testBusy = false; 
     } 
    } 
}; 

但我注意到,startReceive功能的第一次启动后,在testStack缓冲区的开始,还有空的数据(约1000个样本上的Nexus 4,看资料图) 。

Data graph

AudioReceiver的初始化和推出startReceive之间需要很长的时间。什么可能是问题的原因?

+0

您是否发现此问题的任何解决方案@solderingironmen?我遇到了同样的问题。 –

+0

@KhatamNaayak,no。如果你遇到同样的问题,请提出我的问题。 – SolderingIronMen

+0

我有一个解决方法,我将在下面添加以供参考。 –

回答

1

似乎延迟是OS需要时间重新采样数据造成的,并且很难为所有设备提供一个采样率。也提到了other posts。所以,我将音频记录逻辑移至活动onCreate。当我不需要音频或暂停时,我只是丢弃数据。

我总是在录音时没有观察到电池耗尽。虽然这可能不是解决此问题的最佳方法,但对我来说,这绝对是一个可接受的解决方法。

+1

此解决方案不适合我,因为我的最初目标是同步AudioRecord和AudioTrack的启动。但是现在我明白用Java来做这件事是不可能的。 – SolderingIronMen