2012-05-09 14 views
5

オーディオバッファを作成して、新しいクラスに送ろうとしました。 このクラスでは、AudioTrackerでこのバッファを再生しますが、動作しません。 時間通りに音が聞こえますが、音は残響のようです。私は間違いのために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

[OK]を、私はこの問題を考え出しました。ホール効果は、リアルタイムで録音されたスピーカーの音に由来します。悪い間違い。

+4

修正のおめでとう!あなたができるときは、他の人があなたの解決策から学ぶことができるように、あなたの答えに「受け入れられた」とマークするようにしてください。乾杯〜 –

+0

私はbufferSizeとminbufferSizeで遊んで、オーディオデータを忠実に再生することができました。私は入力バッファを8192に固定して1024に出力しました。それはさらに調整することができますが、私の目的に役立ちます。元のコードをありがとう。それは必要に応じて動作します。 – axs

0

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(); 
関連する問題