Частота воспроизведения прибывает кусками, когда выше входного 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 для воспроизведения звуков.

Другие вопросы по тегам