Как уменьшить задержку при повторении ввода звука с микрофона в качестве вывода звука на динамик в приложении для Android - PullRequest
0 голосов
/ 12 декабря 2018

В качестве эксперимента я пытаюсь создать приложение, которое может повторять ввод звука с микрофона в качестве вывода звука на динамик.До сих пор я могу сделать это с задержкой от 0,5 до 1 секунды.Поэтому, если у кого-то есть идеи о том, как улучшить приведенный ниже код для уменьшения задержки.

С Высокопроизводительное аудио Android - Google I / O 2016 Я видел, что задержка на входе может бытьвсего 20 мс, что намного меньше, чем то, что я получаю.

Я пытался выполнить поиск в Google и другие вопросы в StackOverflow, но большинство используемых там методов устарели на уровне API 26.

private fun recordAndPlay(){

    val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    val rate = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE)

    val RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO
    val RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT
    val RECORDER_SAMPLERATE = rate.toInt()
    val bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING)
    val BytesPerElement = 2


    val recorder = AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, bufferSize * BytesPerElement)
    Log.e("Buffer , sample rate","*********** ${recorder.sampleRate}")

    recorder.startRecording()

    val audioAttributes = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build()
    val audioFormat = AudioFormat.Builder().setEncoding(RECORDER_AUDIO_ENCODING)
            .setSampleRate(RECORDER_SAMPLERATE).setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build()

    val recordingThread = Thread(Runnable {
        try {
            val sData = ByteArray(bufferSize)
            var at : AudioTrack? = AudioTrack.Builder()
                    .setAudioAttributes(audioAttributes)
                    .setAudioFormat(audioFormat)
                    .setBufferSizeInBytes(bufferSize*2)
                    .build()
            while (true) {
                recorder.read(sData, 0, bufferSize)  //isRecording = false; onStop button
                at.play()
                if (at != null) {
                    at.write(sData, 0, sData.size)
                }
                at.stop()
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }, "AudioRecorder Thread")

    recordingThread.start()
}

Заранее спасибо.


Примечание. Этот вопрос ранее также затрагивал проблему повторяющегося эха входного звука.Эта проблема была из-за использования динамика телефона, а не наушников, вызывая петлю обратной связи, как упомянуто в комментариях lucky1928.Это эхо было причиной того, что я упустил из виду окружающее, а не какую-либо проблему, связанную с Android, поэтому этот частичный вопрос был удален.Поэтому при тестировании вышеуказанного кода используйте наушники.

...