2012-05-09 34 views
5

Tôi đã cố gắng tạo bộ đệm Âm thanh và gửi cho anh ta một lớp mới. Trong lớp này tôi sẽ chơi bộ đệm này với AudioTracker nhưng nó không hoạt động. Tôi có thể nghe thấy âm thanh đúng giờ nhưng âm thanh giống như âm thanh halleffect. Tôi không có Idear cho sai lầm của tôi và không tìm thấy câu trả lời cho vấn đề này. Tôi hy vọng bạn có thể giúp tôi. (Xin lỗi tiếng Anh của tôi không phải là tốt nhất) Sorcecode:Làm thế nào tôi có thể chuyển bộ đệm âm thanh để phát trực tiếp

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(); 

} 

Trả lời

4

Ok, tôi đã tìm ra vấn đề. Hiệu ứng của hội trường đến từ âm thanh loa được ghi lại trong thời gian thực. Lỗi lầm.

+4

Chúc mừng bạn đã khắc phục! Khi bạn có thể, hãy đảm bảo đánh dấu câu trả lời của bạn là 'được chấp nhận' để những người khác có thể học hỏi từ giải pháp của bạn. Chúc mừng ~ –

+0

Tôi đã chơi xung quanh với bufferSize và minbufferSize và có thể phát lại dữ liệu âm thanh trung thực. Tôi cố định bộ đệm đầu vào đến 8192 và đầu ra là 1024. Nó có thể được điều chỉnh thêm nhưng nó phục vụ mục đích của tôi. Cảm ơn mã ban đầu. Nó hoạt động như mong muốn. – axs

0

Lý do khi bạn ghi dữ liệu vào đối tượng AudioTrack, bạn thực sự mở nó, ghi vào bộ đệm, đóng và nhả nó, và nếu kích thước bộ đệm tối thiểu quá nhỏ, bạn không thể nghe được vì liên tục bắt đầu lại Track âm thanh. Đây là lý do tại sao nó được giải quyết bằng cách thay đổi kích thước bộ đệm. Nếu bạn làm cho nó 8.000 và tỷ lệ mẫu của bạn là 8000, bạn sẽ nghe thấy âm thanh với một sự chậm trễ thứ hai. Để giải quyết vấn đề này, hãy loại bỏ phương thức gửi của bạn và thay đổi phương thức writeAudio thành phương thức này:

riêng void writeAudioData() { dữ liệu byte [] = 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(); 
Các vấn đề liên quan