2012-06-22 84 views
4

我正在使用AudioRecord来录制原始音频进行处理。 完全没有任何噪音的音频记录,但是当回放生成的原始PCM数据时,它会播放,好像它已经加速了很多(最多约两倍)。 我正在查看和播放Audacity中的PCM数据。我正在使用实际的手机(三星Galaxy S5670)进行测试。 记录在44100Hz,16位完成。任何想法可能会导致这种情况?在Android上使用AudioRecord进行录音可加速音频?

以下是记录代码:

public class TestApp extends Activity 
{ 
File file; 
OutputStream os; 
BufferedOutputStream bos;  
AudioRecord recorder; 
int iAudioBufferSize; 
boolean bRecording; 
int iBytesRead; 

Thread recordThread = new Thread(){ 
    @Override 
    public void run() 
    { 
     byte[] buffer = new byte[iAudioBufferSize]; 
     int iBufferReadResult; 
     iBytesRead = 0; 
     while(!interrupted()) 
     { 
      iBufferReadResult = recorder.read(buffer, 0, iAudioBufferSize); 
      // Android is reading less number of bytes than requested. 
      if(iAudioBufferSize > iBufferReadResult) 
      { 
       iBufferReadResult = iBufferReadResult + 
         recorder.read(buffer, iBufferReadResult - 1, iAudioBufferSize - iBufferReadResult); 
      }    
      iBytesRead = iBytesRead + iBufferReadResult; 
      for (int i = 0; i < iBufferReadResult; i++) 
      { 
       try 
       { 
        bos.write(buffer[i]); 
       } catch (IOException e) 
       {            
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    // File Creation and UI init stuff etc. 

    bRecording = false; 
    bPlaying = false; 

    int iSampleRate = AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM); 
    iAudioBufferSize = AudioRecord.getMinBufferSize(iSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    recorder = new AudioRecord(AudioSource.MIC, iSampleRate, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, iAudioBufferSize); 

    bt_Record.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if (!bRecording) 
      { 
       try 
       {      
        recorder.startRecording(); 
        bRecording = true; 
        recordThread.start();      
       } 
       catch(Exception e) 
       { 
        tv_Error.setText(e.getLocalizedMessage()); 
       } 
      } 
      else 
      { 
       recorder.stop(); 
       bRecording = false; 
       recordThread.interrupt(); 
       try 
       { 
        bos.close(); 
       } 
       catch(IOException e) 
       { 

       } 
       tv_Hello.setText("Recorded Sucessfully. Total " + iBytesRead + " bytes."); 
      } 
     } 

    }); 
} 
} 

解决:我张贴这与它挣扎了1-2天。但具有讽刺意味的是,我发布后不久就找到了解决方案。缓冲输出流写入在for循环中花费了太多时间,所以流正在跳过样本。将其更改为阻止写入,删除for循环。完美的作品。

+1

如果您找到解决方案,只需回答自己的问题并将其标记为答案。 – Flow

回答

5

音频跳过是由于写入缓冲区的延迟造成的。 的解决方法就是更换for循环:采用单一记录

 for (int i = 0; i < iBufferReadResult; i++) 
     { 
      try 
      { 
       bos.write(buffer[i]); 
      } catch (IOException e) 
      {            
       e.printStackTrace(); 
      } 
     } 

,就像这样:

 bos.write(buffer, 0, iBufferReadResult); 

我从一本书,工作中使用的代码,我想,对于较低的采样费率和缓冲区更新。

相关问题