2012-05-09 4 views
5

오디오 버퍼를 생성하여 새로운 클래스로 보내려고했습니다. 이 클래스에서는 AudioTracker로이 버퍼를 재생할 수는 있지만 작동하지 않습니다. 소리가 시간에 들릴 수는 있지만 소리는 halleffect와 같습니다. 나는 내 실수에 대한 이드가없고이 문제에 대한 답을 찾지 못했습니다. 도와 주시면 감사하겠습니다. 내가 문제를 파악,오디오 버퍼를 전송하여 직접 재생할 수 있습니까?

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

확인 : 는 Sorcecode (미안 내 영어 가장 좋은하지 않습니다). 홀 효과는 실시간으로 녹음 된 스피커 사운드에서 나옵니다. 나쁜 실수.

+4

수정 사항에 대한 축하해! 가능한 경우 다른 사람들이 귀하의 솔루션에서 배울 수 있도록 귀하의 대답을 '수락'으로 표시하십시오. 건배 ~ –

+0

나는 bufferSize 및 minbufferSize를 가지고 놀았으며 오디오 데이터를 충실하게 재생할 수있었습니다. 입력 버퍼를 8192로 고정하고 1024로 출력했습니다. 더 조정할 수는 있지만 제 목적을 충족시킵니다. 원래 코드를 보내 주셔서 감사합니다. 원하는대로 작동합니다. – axs

0

AudioTrack 개체에 데이터를 쓰는 이유는 실제로 열어서 버퍼에 쓰고 닫은 다음 풀어주기 때문입니다. 최소 버퍼 크기가 너무 작 으면 실제로 다시 들리게 할 수 없습니다. AudioTrack. 이것이 버퍼 크기를 변경하여 해결할 수있는 이유입니다. 8000으로 만들고 샘플 속도가 8000이면 1 초 지연으로 소리가 들립니다. 이 문제를 해결하려면 send 메서드를 제거하고 writeAudio 메서드를 다음과 같이 변경하십시오.

private void writeAudioData() { byte data [] = 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(); 
관련 문제