Hinzufügen eines benutzerdefinierten Audio-Renderers
Sie implementieren einen einfachen Audio-Renderer für den Ton der abonnierten Streams.
Die NoiseAudioDevice Konstruktormethode richtet eine Datei ein, um das eingehende Audio in einer Datei zu speichern.
Dies geschieht einfach, um die Verwendung des Audio-Renderers des benutzerdefinierten Audiotreibers zu veranschaulichen.
Die BaseAudioDevice.initRenderer Methode wird aufgerufen, wenn die Anwendung den Audio-Renderer initialisiert.
Die NoiseAudioDevice Implementierung dieser Methode instanziiert ein neues File-Objekt, in das die Anwendung Audiodaten schreiben wird:
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
}
Die BaseAudioDevice.startRendering Methode wird aufgerufen, wenn das Audiogerät mit dem Rendern (Abspielen) von Audio aus abonnierten Streams beginnen soll. Die NoiseAudioDevice Implementierung dieser Methode startet die capturer Thread, der nach 1 Sekunde in der Warteschlange ausgeführt werden soll:
override fun startRenderer(): Boolean {
rendererStarted = true
rendererHandler?.postDelayed(renderer, rendererIntervalMillis)
return true
}
Die renderer Thread holt sich 1 Sekunde Audio vom Audiobus, indem er die readRenderData Methode der AudioBus Objekt. Dann schreibt es die Audiodaten in die Datei (für Samplezwecke). Und wenn das Audiogerät noch zum Rendern von Audiosamples verwendet wird, wird ein Timer gesetzt, um die rendererHandler Thread nach 0,1 Sekunden erneut:
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)
}
}
}
Benutzerdefinierter Audiotreiber
Hier erfahren Sie, wie Sie einen benutzerdefinierten Audiotreiber verwenden, um den Audio-Stream des Herausgebers und der Teilnehmer anzupassen. Sie werden den benutzerdefinierten Audiotreiber verwenden, wenn Sie die Audio-Wiedergabe Ihrer eigenen Audiodatei starten und stoppen und alles tun möchten, was über das Standardverhalten des vom SDK bereitgestellten Live-Video-Chats hinausgeht.