Añadir un renderizador de audio personalizado
Implementarás un sencillo renderizador de audio para el audio de los flujos suscritos.
En NoiseAudioDevice configura un archivo para guardar el audio entrante en un archivo.
Esto se hace simplemente para ilustrar un uso del renderizador de audio del controlador de audio personalizado.
En BaseAudioDevice.initRenderer cuando la aplicación inicializa el renderizador de audio.
La dirección NoiseAudioDevice de este método crea un nuevo objeto File, en el que la aplicación escribirá los datos de audio:
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
}
En BaseAudioDevice.startRendering se llama cuando el dispositivo de audio debe empezar a reproducir el audio de los flujos suscritos. El método NoiseAudioDevice de este método inicia el capturer hilo que se ejecutará en la cola después de 1 segundo:
override fun startRenderer(): Boolean {
rendererStarted = true
rendererHandler?.postDelayed(renderer, rendererIntervalMillis)
return true
}
En renderer obtiene 1 segundo de audio del bus de audio llamando a la función readRenderData método del AudioBus objeto. A continuación, escribe los datos de audio en el archivo (con fines de muestreo). Y, si el dispositivo de audio todavía se está utilizando para renderizar muestras de audio, establece un temporizador para ejecutar la función rendererHandler después de 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)
}
}
}
Controlador de audio personalizado
Aprenda a utilizar un controlador de audio personalizado para personalizar el audio de la transmisión del editor y del suscriptor. Utilizará el controlador de audio personalizado cuando desee iniciar y detener el audio reproducir su propio archivo de audio y hacer cualquier cosa fuera del comportamiento predeterminado del chat de vídeo en directo proporcionado por el SDK.