实现独唱
更新时间: 2024/11/20 17:05:14
独唱是指麦位上的用户独自演唱,房间内的观众在线观看。
功能原理
独唱的原理图如下图所示。
NERTC SDK 将主唱的伴奏和干声传给 NERTC 服务器, NERTC 服务器将音频传给观众端。
前提条件
主唱实现方案
-
主唱调用
applyOnSeat
申请上麦,成为连麦主播。fun applyOnSeat(callback: NECallback<Unit>) { currentRoomContext?.seatController?.submitSeatRequest(callback) }
-
麦位上的用户可以点歌,具体实现逻辑需要业务自行实现。
-
歌词展示与同步,具体实现逻辑需要业务自行实现。
-
主唱以主流方式发送伴奏,将伴奏和人声混流后的音频流推送到远端。
rtcController?.setParameters("key_audio_external_audio_mix", true) rtcController?.setParameters("engine.audio.ktv.chrous", true)
-
歌词同步。
//主唱将自己的播放进度通过SEI消消息发送出去 val json = JSONObject() json.put("pos", pos) rtcController?.sendSEIMsg(json.toString())
-
主唱调用
submitSeatRequest
接口申请下麦。fun submitSeatRequest(callback: NECallback<Unit>) { currentRoomContext?.seatController?.submitSeatRequest(callback) }
观众端实现方案
- 观众端调用
setLocalAudioProfile
接口,设置音频profile
类型为HighQualityStereo
,设置scenario
为MUSIC
。 - 观众端同步本地歌词进度。
- 观众端监听
onNERtcEngineRecvSEIMsg
的 SEI 回调信息。 - 观众收到主唱发送的 SEI 消息,根据拿到的时间戳,解析歌词、展示时间戳对应时间段的歌词数据。
override fun onRtcRecvSEIMsg(uuid: String, seiMsg: String) { //同步本地歌词进度 // 经验值减去传输花费的时间 if (songMode == NESongMode.SERIAL_CHORUS) { // 如果是串行合唱,副唱收到主唱发送的播放进度,副唱将它从副唱侧在发送出去。听众收到主唱发送的SEI不处理,只处理副唱发来的进度 //如果是主唱 // 主唱发送的SEI消息 //当前用户是合唱者,将合唱者的播放进度通知出去 // 如果是副唱 //主唱 不监听副唱过来的进度 // 将曲的播放进度通知出去 } else { // 将曲的播放进度通知出去 } }
- 观众端监听
此文档是否对你有帮助?