Adicionando um renderizador de áudio personalizado
Você implementará um renderizador de áudio simples para o áudio dos fluxos aos quais está inscrito.
O NoiseAudioDevice O método construtor configura um arquivo para salvar o áudio recebido.
Isso é feito simplesmente para ilustrar um uso do renderizador de áudio do driver de áudio personalizado.
O BaseAudioDevice.initRenderer O método é chamado quando o aplicativo inicializa o renderizador de áudio.
O NoiseAudioDevice A implementação desse método instancia um novo objeto `File`, no qual o aplicativo gravará os dados de áudio:
override fun initRenderer(): Boolean {
rendererBuffer = ByteBuffer.allocateDirect(SAMPLING_RATE * 2)
val documentsDirectory = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)
rendererFile = File(documentsDirectory, "output.raw")
if (rendererFile?.exists() == false) {
try {
rendererFile?.parentFile?.mkdirs()
rendererFile?.createNewFile()
} catch (e: IOException) {
e.printStackTrace()
}
}
return true
}
O BaseAudioDevice.startRendering O método é chamado quando o dispositivo de áudio deve começar a reproduzir o áudio dos fluxos aos quais está inscrito. O NoiseAudioDevice A implementação desse método inicia o capturer thread a ser executado na fila após 1 segundo:
override fun startRenderer(): Boolean {
rendererStarted = true
rendererHandler?.postDelayed(renderer, rendererIntervalMillis)
return true
}
O renderer O thread obtém 1 segundo de áudio do barramento de áudio chamando a função readRenderData método do AudioBus objeto. Em seguida, ele grava os dados de áudio no arquivo (para fins de amostragem). E, se o dispositivo de áudio ainda estiver sendo usado para reproduzir amostras de áudio, ele define um temporizador para executar o rendererHandler retomar o thread após 0,1 segundos:
private var rendererHandler: Handler? = null
private val renderer: Runnable = object : Runnable {
override fun run() {
rendererBuffer?.clear()
audioBus.readRenderData(rendererBuffer, SAMPLING_RATE)
try {
val stream = FileOutputStream(rendererFile)
stream.write(rendererBuffer?.array())
stream.close()
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
if (rendererStarted && !audioDriverPaused) {
rendererHandler?.postDelayed(this, rendererIntervalMillis)
}
}
}
Driver de áudio personalizado
Aprenda a usar um driver de áudio personalizado para personalizar o áudio dos fluxos do emissor e do assinante. Você utilizará o driver de áudio personalizado quando quiser iniciar e interromper a reprodução de seu próprio arquivo de áudio, bem como realizar qualquer ação que não faça parte do comportamento padrão do chat de vídeo ao vivo fornecido pelo SDK.