Частота воспроизведения прибывает кусками, когда выше входного hz - щелкающий звук
Мой первый эксперимент со звуком, так что это может быть не самый умный вопрос. Но я пытаюсь записать звук с микрофона и воспроизвести его через гарнитуру или динамик. И доведение частоты воспроизведения до половины HZ работает просто отлично, но если сделать вдвое больше, звук будет звучать так, как будто он идет частями. Я предполагаю, что недостаточно играть, я играл в спящем режиме и увеличивал размер буфера записи, но безуспешно.
Кто-нибудь знает, как я могу решить эту проблему?
У меня есть буфер 8000 и hz=8000, например, в то время как pbhz=11025.
//audio configuration and SCO Bluetooth connection.
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
aManager.startBluetoothSco();
aManager.setBluetoothScoOn(true);
aManager.setMode(AudioManager.MODE_NORMAL);
arec = new AudioRecord(
MediaRecorder.AudioSource.VOICE_RECOGNITION,
hz,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize);
if (AcousticEchoCanceler.isAvailable()) {
AcousticEchoCanceler echoCanceller = AcousticEchoCanceler.create(arec.getAudioSessionId());
if (echoCanceller != null) {
// echoCanceller.setEnableStatusListener(this);
echoCanceller.setEnabled(true);
}
} else { Log.e("configAudio", "Echo Canceler not available");}
// Creates noise suppressor if available
if (NoiseSuppressor.isAvailable()) {
NoiseSuppressor noiseSuppressor = NoiseSuppressor.create(arec.getAudioSessionId());
if (noiseSuppressor != null) {
// noiseSuppressor.setEnableStatusListener(this);
noiseSuppressor.setEnabled(true);
}
} else { Log.e("configAudio", "Noise Suppressor not available");}
atrack = new AudioTrack(AudioManager.STREAM_MUSIC,
hz,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
buffersize,
AudioTrack.MODE_STREAM);
atrack.setPlaybackRate(pbhz);
}
arec.startRecording();
atrack.play();
Runnable runnable = new Runnable() {
@Override
public void run() {
while (isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
}
};
new Thread(runnable).start();
1 ответ
Когда вы включаете SCO, вам нужно использовать STREAM_VOICE_CALL, а не STREAM_MUSIC для воспроизведения звуков.