RevueSDK · Swift reference Guides

Class

AudioCompositor

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

class AudioCompositor

Overview

不綁定 Room,用戶自己建立、管理輸入、發布。 內部使用 AVAudioEngine 離線手動渲染模式(offline manual rendering)進行混音。

MCU 場景需要為每個參與者建立獨立的 AudioCompositor(個別化混音,排除該人自己的聲音)。

// === 四人 MCU(Host + A, B, C)完整案例 ===

var mixers: [String: AudioCompositor] = [:]   // 給每個人的專屬混音
var localMix = AudioCompositor()               // 本地播放用
try localMix.start()

// --- 參與者加入 ---
func room(_ room: Room, participantDidConnect participant: RemoteParticipant) {

    // 1. 為新人建立專屬混音器(排除新人自己的聲音)
    let mixer = AudioCompositor()
    try mixer.start()
    mixer.addTrack(localParticipant.microphoneTrack)  // Host 自己的聲音

    // 加入其他已在房間的人的聲音
    for (id, remote) in room.remoteParticipants where id != participant.identity {
        mixer.addTrack(remote.audioTrack)
    }
    mixers[participant.identity] = mixer

    // 2. 把新人的聲音加進其他人的混音器
    for (id, existingMixer) in mixers where id != participant.identity {
        existingMixer.addTrack(participant.audioTrack)
    }

    // 3. 本地播放也加入新人
    localMix.addTrack(participant.audioTrack)

    // 4. 發布給該參與者
    localParticipant.publish(audioTrack: mixer.outputTrack, to: participant)
}

// --- 參與者離開 ---
func room(_ room: Room, participantDidDisconnect participant: RemoteParticipant) {

    // 1. 停止並移除此人的專屬混音器
    if let mixer = mixers.removeValue(forKey: participant.identity) {
        mixer.stop()
    }

    // 2. 從其他人的混音器中移除此人的聲音
    for (_, existingMixer) in mixers {
        existingMixer.removeTrack(participant.audioTrack)
    }

    // 3. 本地播放也移除
    localMix.removeTrack(participant.audioTrack)
}

// --- 離開房間:完整釋放所有資源 ---
func leaveRoom() {
    // 1. 停止所有專屬混音器
    for (_, mixer) in mixers {
        mixer.stop()
    }
    mixers.removeAll()

    // 2. 停止本地播放混音器
    localMix.stop()

    // 3. 斷開所有遠端參與者
    Room.shared.disconnectAll()
}

// --- 穩定後四人房間狀態 ---
// mixers["A"]  = Host + B + C  → publish to A
// mixers["B"]  = Host + A + C  → publish to B
// mixers["C"]  = Host + A + B  → publish to C
// localMix     = A + B + C     → 本地播放

Topics

Initializers

Instance Properties

Instance Methods