カスタムオーディオレンダラの追加
購読ストリームのオーディオ用のシンプルなオーディオ・レンダラーを実装します。
について NoiseAudioDevice コンストラクタのメソッドは、入力されたオーディオをファイルに保存するためのファイルを設定します。
これは、単にカスタムオーディオドライバのオーディオレンダラの使い方を説明するためのものです。
について BaseAudioDevice.initRenderer メソッドは、アプリがオーディオレンダラーを初期化するときに呼び出されます。
このメソッドは NoiseAudioDevice このメソッドを実装すると、新しいFileオブジェクトがインスタンス化され、そこにアプリがオーディオデータを書き込みます:
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
}
について BaseAudioDevice.startRendering メソッドは、オーディオデバイスがサブスクライブしたストリームからオーディオのレンダリング(再生)を開始するときに呼び出される。このメソッドは NoiseAudioDevice このメソッドの実装は capturer スレッドが1秒後にキューで実行される:
override fun startRenderer(): Boolean {
rendererStarted = true
rendererHandler?.postDelayed(renderer, rendererIntervalMillis)
return true
}
について renderer スレッドは、オーディオバスから1秒分のオーディオを取得する。 readRenderData のメソッドを使用する。 AudioBus オブジェクトを作成します。そして、オーディオデータをファイルに書き込みます(サンプル用)。また、オーディオデバイスがまだオーディオサンプルのレンダリングに使われている場合は、タイマーをセットして rendererHandler 0.1秒後に再びスレッドを実行する:
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)
}
}
}
カスタムオーディオドライバー
カスタムオーディオドライバーを使用して、パブリッシャーとサブスクライバーのストリームオーディオをカスタマイズする方法を説明します。カスタムオーディオドライバは、独自のオーディオファイルを再生したり、SDKが提供するライブビデオチャットのデフォルトの動作以外のことを行う場合に使用します。