ReVue KITSwift reference Guides

Class

AudioCompositor

音訊混音器 — 將多路 AudioTrack 混音為一路輸出(獨立工具)

class AudioCompositor

Overview

不綁定 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

Instance Methods