5

Audio バッファを作成して、彼を新しいクラスに送り込もうとしました。このクラスでは、このバッファを AudioTracker で再生しますが、機能しません。時間通りに音が聞こえますが、音がホール効果のようです。私は自分の間違いのアイデアがなく、この問題に対する答えが見つかりませんでした。あなたが私を助けてくれることを願っています。(私の英語が上手でなくて申し訳ありません) ソースコード:

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

2 に答える 2

4

わかりました、私は問題を理解しました。ホール効果は、リアルタイムで録音されたスピーカーの音から発生しました。悪い間違い。

于 2012-05-10T13:21:09.200 に答える
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();
于 2014-03-04T20:07:20.353 に答える