2012-05-09 113 views
5

我试图创建一个音频缓冲区并将其发送到新的类。 在这个类中我会用AudioTracker播放这个缓冲区,但它不起作用。 我可以准时听到声音,但声音就像一个halleffect。我对我的错误没有Idear,也没有找到解决这个问题的答案。 我希望你能帮助我。 (对不起我的英语不是最好的) Sorcecode:如何传输音频缓冲区直接播放

public class input { 
private static final String TAG = "Aufnahme"; 
private AudioRecord recorder = null; 
private boolean isRecording = false; 
private int SAMPLERATE = 8000; 
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS, 
     AUDIO_FORMAT); 
private Thread recordingThread = null; 

public void startRecording() { 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE, 
      CHANNELS, AUDIO_FORMAT, bufferSize); 

    recorder.startRecording(); 
    isRecording = true; 

    recordingThread = new Thread(new Runnable() 

    { 
     public void run() { 
      writeAudioData(); 
     } 

    }); 
    recordingThread.start(); 

} 

public void stopRecording() { 
    isRecording = false; 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    recordingThread = null; 
} 

private void writeAudioData() { 

    byte data[] = new byte[bufferSize]; 

    while (isRecording) { 

     recorder.read(data, 0, bufferSize); 
     send(data); 

    } 
} 

private void send(byte[] data) { 

    int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 

    at.play(); 
    at.write(data, 0, bufferSize); 
    at.stop(); 
    at.release(); 

} 

回答

4

好吧,我想通了这个问题。大厅效应来自实时记录的扬声器声音。错误的错误。

+4

祝贺修复!如果可以,请确保将答案标记为“已接受”,以便其他人可以从您的解决方案中学习。干杯〜 –

+0

我使用了bufferSize和minbufferSize,并且能够忠实地回放音频数据。我将输入缓冲区固定为8192并输出到1024.它可以进一步调整,但它符合我的目的。感谢您的原始代码。它按需要工作。 – axs

0

当您将数据写入到AudioTrack对象时,实际打开它,写入缓冲区,关闭并释放它,并且如果最小缓冲区大小太小,您实际上听不到因为不断重新初始化AudioTrack。这就是为什么通过更改缓冲区大小来解决这个问题。如果您将其设为8000并且您的采样率为8000,则您将在一秒钟内听到声音。要解决此问题,请删除您的发送方法,并将writeAudio方法更改为此:

private void writeAudioData(){0} {0} {0} = new byte [bufferSize];

int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 


    at.play(); 

    while (isRecording) { 
     recorder.read(data, 0, bufferSize); 
     at.write(data, 0, bufferSize); 
    } 
    at.stop(); 
    at.release(); 
相关问题