просто слышен щелчок при воспроизведении аудиодорожки

Я пытаюсь записать звук с микрофона, а затем воспроизвести его, но все, что я здесь, это щелкающий звук. И AudioTrack, и AudioRecord имеют одинаковые настройки и правильно инициализированы. Вот мой код:

    stop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            isRecording = false;
            recordingThread.join();


            player = findAudioTrack();
            player.play();

            for (int i = 0; i < audioQueue.size(); i++) {
                int written = player.write(audioQueue.get(i), 0,
                        audioQueue.get(i).length);
            }

            player.stop();
            player.release();
            player = null;
        }
    });
}

private void startRecording() {

    recorder = findAudioRecord();

    recorder.startRecording();
    isRecording = true;
    recordingThread = new Thread(new Runnable() {
        public void run() {
            addAudioToQueue();
        }
    }, "AudioRecorder Thread");
    recordingThread.start();
}

private void addAudioToQueue() {
    short[] capturedAudio = new short[recordBufferSize/2];
    while (isRecording) {
        int read = recorder.read(capturedAudio, 0, capturedAudio.length);
        audioQueue.add(capturedAudio);
    }
    recorder.stop();
    recorder.release();
    recorder = null;
}

}

Кто-нибудь знает, почему это так?

Вот полный исходный код: https://www.dropbox.com/s/h38cs9vjkztyyro/AudioTesting.java


person james    schedule 01.07.2013    source источник
comment
Что за запись?   -  person mikołak    schedule 01.07.2013


Ответы (1)


Вероятно, это связано с тем, что вы используете массив short вместо массива byte.

public int read (byte[] audioData, int offsetInBytes, int sizeInBytes)

Вполне вероятно, что эта функция заполняет только первые byte каждого short, поэтому у вас остается половина каждого индекса, состоящая из 1 byte аудиоданных, а другая byte — мусор или нули.

Попробуйте использовать массив byte вместо short.

person David Freitag    schedule 01.07.2013
comment
к сожалению, я все еще слышу щелкающий звук - person james; 01.07.2013
comment
Возможно, дело не в том, как вы записываете звук, а в том, как вы его воспроизводите? - person David Freitag; 01.07.2013
comment
возможно, я добавил полный исходный код, поэтому не стесняйтесь проверять, есть ли там мои ошибки... Я создаю bluetooth VOIP и скопировал оттуда код, который использовал для его создания. Bluetooth VOIP на самом деле работает (не очень хорошего качества, но вы можете слышать мой голос и понимать его), поэтому я не могу понять, почему это не работает - person james; 01.07.2013
comment
Казалось бы, щелчки при использовании AudioTrack — известная проблема. Я бы попробовал исправление, представленное здесь: stackoverflow.com/questions/8203671/ Хотя у меня возникает соблазн сказать, что я больше связан либо с вашей частотой дискретизации, либо с размером вашего буфера. Попробуйте поиграть с этим решением и некоторыми вашими настройками, чтобы увидеть, сможете ли вы избавиться от кликов. - person David Freitag; 01.07.2013
comment
одна вещь, которую я заметил, это то, что если я продлеваю слог и нажимаю стоп во время пения этого слога, трек будет воспроизводить только этот слог, но ничего из того, что я сказал перед ним ... - person james; 02.07.2013