2012-02-23 35 views
2

我需要記錄並同時播放音頻和我使用的2個線程it.here幫助是代碼AudioRecorder在Android的錯誤無效的緩衝區大小

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

    if (recorder.getState() == android.media.AudioRecord.STATE_INITIALIZED) 
     recorder.startRecording(); 
    isRecording = true; 
    audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, bufferSize, 
      AudioTrack.MODE_STREAM); 

    audioPlayer.play(); 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(true) 
      { 
      readBytes = recorder.read(data, 0, bufferSize); 
      if (readBytes == AudioRecord.ERROR_INVALID_OPERATION) 
       System.out.println("ERROR_INVALID_OPERATION"); 
      else if (readBytes == AudioRecord.ERROR_BAD_VALUE) 
       System.out.println("ERROR_BAD_VALUE"); 


      } 

     } 
    }).start(); 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      if (readBytes > 0) 
       audioPlayer.write(data, 0, readBytes); 
     } 
    }).start(); 

我得到的錯誤如下: 02-23 14:19:59.625:E/AudioTrack(1786):無效緩衝區大小:minFrameCount 2400,幀數又預先2048

由於

+0

你是如何解決這個問題的。 – Samuel 2013-02-18 04:09:05

+0

@Samuel請務必檢查評論其實完成了很長時間後..不確定其完全正確 – 2013-02-18 13:03:09

+0

對不起,我想我沒有看清楚。可能你可以接受你自己的回答作爲答案。同時我設法自己解決它。 – Samuel 2013-02-19 04:14:30

回答

0

這是我用來解決問題的代碼,希望它有助於

公共類聊天擴展使用此活動{

Devc devc; 
byte[] bytesent, bytesgot; 
private BluetoothSocket mmSocket = null; 
private InputStream mmInStream; 
private OutputStream mmOutStream; 
Handler handler; 
Button send; 
TextView getmessage; 
EditText sentmessage; 
TextView nowsentmessage; 
TextView you; 
int bytes = 0; 
Thread thread; 
private int audioSource = MediaRecorder.AudioSource.MIC; 
private int samplingRate = 44100; /* in Hz */ 
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
private int bufferSize = AudioRecord.getMinBufferSize(samplingRate, 
     channelConfig, audioFormat); 
private int sampleNumBits = 16; 
private int numChannels = 1; 
AudioTrack audioPlayer; 
AudioRecord recorder; 
Boolean isRecording; 
byte[] bytes2; 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chat); 
    getmessage = (TextView) findViewById(R.id.gottext); 
    sentmessage = (EditText) findViewById(R.id.entertext); 
    nowsentmessage = (TextView) findViewById(R.id.metext); 
    you = (TextView) findViewById(R.id.you); 
    send = (Button) findViewById(R.id.sent); 
    bufferSize += 2048; 
    recorder = new AudioRecord(audioSource, samplingRate, channelConfig, 
      audioFormat, 44100); 

    audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, bufferSize, 
      AudioTrack.MODE_STREAM); 

    handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 

      // display each item in a single line 
     } 
    }; 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    mmSocket = Devc.bluetoothSocket; 
    InputStream tmpIn = null; 
    OutputStream tmpOut = null; 

    // Get the input and output streams, using temp objects because 
    // member streams are final 
    try { 
     tmpIn = mmSocket.getInputStream(); 
     tmpOut = mmSocket.getOutputStream(); 
    } catch (IOException e) { 
    } 

    mmInStream = tmpIn; 
    mmOutStream = tmpOut; 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      recorder.startRecording(); 
      isRecording = true; 
      while (true) { 
       int readBytes = 0; 
       readBytes = recorder.read(bytesent, 0, bufferSize); 
       if (readBytes > 0) { 
        write(bytesent); 
        bufferSize += 2048; 
       } 

      } 

     } 
    }).start(); 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub\ 
      while (true) { 
       int readBytes = 0; 
       try { 
        bytes = mmInStream.read(bytesgot); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       audioPlayer.write(bytesgot, 0, bytes); 
       audioPlayer.play(); 

      } 
     } 
    }).start(); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    try { 
     mmInStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     mmOutStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    cancel(); 
} 

public void write(byte[] bytes) { 
    try { 

     mmOutStream.write(bytes); 
     mmOutStream.flush(); 
    } catch (IOException e) { 
    } 
} 

public void cancel() { 
    try { 
     mmSocket.close(); 
    } catch (IOException e) { 
    } 
} 

@Override 
protected void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    cancel(); 
    thread.stop(); 
    Chat.this.finish(); 
    // thread.stop(); 
} 

}

+0

添加兩個線程用於播放和錄製音頻 – 2013-02-18 12:59:58

1

嘗試這樣

  int MIN_BUF_SIZE_REC = AudioRecord.getMinBufferSize(8000, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT); 
      AudioRecord recorder = new AudioRecord(
        MediaRecorder.AudioSource.MIC, 8000, 
        AudioFormat.CHANNEL_CONFIGURATION_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, MIN_BUF_SIZE_REC); 
+1

獲取錯誤:: 02-23 15:57:31.984:E/AndroidRuntime(5826):導致:java.lang.IllegalArgumentException:音頻緩衝區大小無效。 – 2012-02-23 10:28:55

0

入住這out..i已經解決了同樣的問題代碼.....
以及我創建了兩個用於記錄和回放的兩個內部類(RecordAudio calss和PlayAudio類)。 如果你想要更清晰的音頻剪輯,你可以使用android noisesuppressor。
乾杯....:D

public class AltAudioRecorder extends Activity implements OnClickListener { 

RecordAudio recordTask; 
PlayAudio playTask; 
Button startRecordingButton, stopRecordingButton, startPlaybackButton, 
     stopPlaybackButton; 
TextView statusText; 
File recordingFile; 
boolean isRecording = false; 
boolean isPlaying = false; 

int frequency = 8000; 
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    statusText = (TextView) this.findViewById(R.id.StatusTextView); 
    startRecordingButton = (Button) this 
      .findViewById(R.id.StartRecordingButton); 
    stopRecordingButton = (Button) this 
      .findViewById(R.id.StopRecordingButton); 
    startPlaybackButton = (Button) this 
      .findViewById(R.id.StartPlaybackButton); 
    stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybakButton); 
    startRecordingButton.setOnClickListener(this); 
    stopRecordingButton.setOnClickListener(this); 
    startPlaybackButton.setOnClickListener(this); 
    stopPlaybackButton.setOnClickListener(this); 
    stopRecordingButton.setEnabled(false); 
    startPlaybackButton.setEnabled(false); 
    stopPlaybackButton.setEnabled(false); 

    File path = new File(Environment.getExternalStorageDirectory() 
      .getAbsolutePath() 
      + "/FinalOne/src/com/example/finalone/files/"); 
    path.mkdirs(); 
    try { 
     recordingFile = File.createTempFile("recording", ".pcm", path); 
    } catch (IOException e) { 
     throw new RuntimeException("Couldn't create file on SD card", e); 
    } 
} 

@Override 
public void onClick(View v) { 
    if (v == startRecordingButton) { 
     record(); 
    } else if (v == stopRecordingButton) { 
     stopRecording(); 
    } else if (v == startPlaybackButton) { 
     play(); 
    } else if (v == stopPlaybackButton) { 
     stopPlaying(); 
    } 
} 

public void play() { 
    startPlaybackButton.setEnabled(true); 
    playTask = new PlayAudio(); 
    playTask.execute(); 
    stopPlaybackButton.setEnabled(true); 
} 

public void stopPlaying() { 
    isPlaying = false; 
    stopPlaybackButton.setEnabled(false); 
    startPlaybackButton.setEnabled(true); 
    } 

public void record() { 
    startRecordingButton.setEnabled(false); 
    stopRecordingButton.setEnabled(true); 
    // For Fun 
    startPlaybackButton.setEnabled(true); 
    recordTask = new RecordAudio(); 
    recordTask.execute(); 
    } 
public void stopRecording() { 
    isRecording = false; 
    }