- RevueSDK
- AudioCompositor
Class
AudioCompositor
音訊混音器 — 將多路 AudioTrack 混音為一路輸出(獨立工具)
class AudioCompositorOverview
不綁定 Room,用戶自己建立、管理輸入、發布。 內部使用 AVAudioEngine 離線手動渲染模式(offline manual rendering)進行混音。
MCU 場景需要為每個參與者建立獨立的 AudioCompositor(個別化混音,排除該人自己的聲音)。
一定要先 start() 再 addTrack(_:):start() 之前加入的 track 不會被混音,之後再加也沒用。 混音結果只會送進 outputTrack,不會在本機播放。 不能同時從多條執行緒呼叫,請在主執行緒呼叫;isRunning 在呼叫的那條執行緒發出通知。
// === MCU host:每位 guest 一台混音器,排除該 guest 本人 ===
var mixers: [String: AudioCompositor] = [:] // guest identity → 給他的混音
var guestAudio: [String: AudioTrack] = [:] // guest identity → 他的聲音
// --- guest 的聲音到了(RoomDelegate 的 didSubscribeTrack)---
func room(_ room: Room, participant: RemoteParticipant, didSubscribeTrack publication: RemoteTrackPublication) {
guard let audio = publication.track as? AudioTrack else { return }
Task { @MainActor in
let local = room.localParticipant!
// 1. 新 guest 的聲音加進其他人的混音器
for mixer in mixers.values { mixer.addTrack(audio) }
guestAudio[participant.identity] = audio
// 2. 為新 guest 建立專屬混音器:先 start 再 addTrack
let mixer = AudioCompositor()
try mixer.start()
mixer.addTrack(local.microphoneTrack) // host 自己的聲音
for (id, other) in guestAudio where id != participant.identity {
mixer.addTrack(other) // 其他 guest,不含他本人
}
mixers[participant.identity] = mixer
// 3. 只發布給這位 guest
if let output = mixer.outputTrack {
try await local.publish(audioTrack: output, to: participant)
}
}
}
// --- guest 離開 ---
func room(_ room: Room, participantDidDisconnect participant: RemoteParticipant) {
mixers.removeValue(forKey: participant.identity)?.stop()
if let audio = guestAudio.removeValue(forKey: participant.identity) {
for mixer in mixers.values { mixer.removeTrack(audio) }
}
}
// --- 穩定後(host + A, B, C)---
// mixers["A"] = host + B + C → publish to A
// mixers["B"] = host + A + C → publish to B
// mixers["C"] = host + A + B → publish to C
Topics
Initializers
Instance Properties
var autoOutputSilentBuffer: Bool啟動無聲音頻輸出(在沒有任何輸入時也補幀輸出),預設 false
var isRunning: Bool混音器是否運行中(唯讀)
var outputTrack: LocalAudioTrack?混音輸出 Track(可以發布給好友,或交給
TrackRecorder錄影)var tracks: [AudioTrack]當前所有輸入 Track(唯讀)
Instance Methods
func addTrack(AudioTrack)加入音訊 Track 到混音
func removeTrack(AudioTrack)從混音中移除音訊 Track
func start() throws啟動混音器
func stop()停止混音器,釋放所有資源