输入关键词搜索,支持 AI 答疑

实现独唱

更新时间: 2024/11/20 17:05:14

独唱是指麦位上的用户独自演唱,房间内的观众在线观看。

功能原理

独唱的原理图如下图所示。

独唱的原理图.png

NERTC SDK 将主唱的伴奏和干声传给 NERTC 服务器, NERTC 服务器将音频传给观众端。

前提条件

已实现加入和离开 RTC 房间。

主唱实现方案

  1. 主唱调用applyOnSeat申请上麦,成为连麦主播。

    fun applyOnSeat(callback: NECallback<Unit>) {
        currentRoomContext?.seatController?.submitSeatRequest(callback)
    }
    
  2. 麦位上的用户可以点歌,具体实现逻辑需要业务自行实现。

  3. 歌词展示与同步,具体实现逻辑需要业务自行实现。

  4. 主唱以主流方式发送伴奏,将伴奏和人声混流后的音频流推送到远端。

    rtcController?.setParameters("key_audio_external_audio_mix", true)
    rtcController?.setParameters("engine.audio.ktv.chrous", true)
    
  5. 歌词同步。

    //主唱将自己的播放进度通过SEI消消息发送出去
    val json = JSONObject()
    json.put("pos", pos)
    rtcController?.sendSEIMsg(json.toString())
    
  6. 主唱调用 submitSeatRequest 接口申请下麦。

    fun submitSeatRequest(callback: NECallback<Unit>) {
            currentRoomContext?.seatController?.submitSeatRequest(callback)
        }
    

观众端实现方案

  1. 观众端调用 setLocalAudioProfile接口,设置音频 profile 类型为 HighQualityStereo,设置 scenarioMUSIC
  2. 观众端同步本地歌词进度。
    1. 观众端监听 onNERtcEngineRecvSEIMsg 的 SEI 回调信息。
    2. 观众收到主唱发送的 SEI 消息,根据拿到的时间戳,解析歌词、展示时间戳对应时间段的歌词数据。
    override fun onRtcRecvSEIMsg(uuid: String, seiMsg: String) {
         //同步本地歌词进度
         // 经验值减去传输花费的时间
        if (songMode == NESongMode.SERIAL_CHORUS) { // 如果是串行合唱,副唱收到主唱发送的播放进度,副唱将它从副唱侧在发送出去。听众收到主唱发送的SEI不处理,只处理副唱发来的进度
            //如果是主唱
                // 主唱发送的SEI消息
                //当前用户是合唱者,将合唱者的播放进度通知出去
            // 如果是副唱
                //主唱 不监听副唱过来的进度
                // 将曲的播放进度通知出去
        } else {
          // 将曲的播放进度通知出去
        }
    }
    
此文档是否对你有帮助?
有帮助
去反馈
  • 功能原理
  • 前提条件
  • 主唱实现方案
  • 观众端实现方案