В качестве эксперимента я пытаюсь создать приложение, которое может повторять ввод звука с микрофона в качестве вывода звука на динамик.До сих пор я могу сделать это с задержкой от 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, поэтому этот частичный вопрос был удален.Поэтому при тестировании вышеуказанного кода используйте наушники.