菊风云平台
菊风云平台视频互动直播更多功能

Windows 进阶

1. 互动连麦

在语音直播中,观众可以向主播发送语音连麦互动请求,主播也可以对加入直播的观众发送语音连麦请求。

语音连麦的流程如下图所示:

1.1 发送连麦请求

通过发送消息功能实现连麦请求的发送,接口如下:

/// <summary>
/// 频道中发送消息,当 toUserId 不为 null 时,content 不能大于 4k
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="content">消息内容</param>
/// <param name="toUserId">接收方成员的userid,值为null发送给所有人</param>
/// <returns>是否发送成功</returns>
public bool sendMessage(string type, string content, string toUserId)

示例代码

mediaChannel.sendMessage("request_video", "消息内容", "主播id");

1.2 接受连麦

连麦消息发送后,主播会收到 onMessageReceive 回调

/// <summary>
/// 接收频道消息的回调
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="content">消息内容</param>
/// <param name="fromUserId">消息发送成员userId</param>
void onMessageReceive(string type, string content, string fromUserId);

此时,主播可以根据消息类型(开发者可以自定义消息类型字符串)以及消息发送的对象进行对应的处理。

如果是语音连麦,则主播同意后,连麦成员会收到成员状态更新的回调,此时请求连麦的成员需要调用 enableUploadAudioStream 接口上传本地音频流。

主播同意连麦后,成员状态变为连麦互动状态。此时需要调用“设置状态”接口改变成员的状态。

1.3 设置状态

当成员与主播进行音频连麦、停止连麦以及连麦成员离开时,均需要调用下面的接口设置成员状态

/// <summary>
/// 设置自定义状态
/// </summary>
/// <param name="customState">自定义状态</param>
/// <param name="participant">成员,null则为自己</param>
public void setCustomState(JCMediaChannelCustomState customState, JCMediaChannelParticipant participant)

状态值可以根据 JCMediaChannelCustomState 枚举值自定义,JCMediaChannelCustomState 有以下几种

/// <summary>
/// 无自定义状态
/// </summary>
CUSTOM_STATE_NONE = 0,
/// <summary>
/// 自定义状态0
/// </summary>
CUSTOM_STATE_0 = 1 << 12,
/// <summary>
/// 自定义状态1
/// </summary>
CUSTOM_STATE_1 = 1 << 13,
/// <summary>
/// 自定义状态2
/// </summary>
CUSTOM_STATE_2 = 1 << 14,
/// <summary>
/// 自定义状态3
/// </summary>
CUSTOM_STATE_3 = 1 << 15

例如

//自定义音频连麦状态
JCMediaChannelCustomState STATE_AUDIO_JOIN = JCMediaChannelConstants.CUSTOM_STATE_0;

示例代码

//自定义音频连麦状态
JCMediaChannelCustomState STATE_AUDIO_JOIN = JCMediaChannelConstants.CUSTOM_STATE_0;
//收到连麦请求信息
public void mediaChannelMessage(NSNotification note) {
  //取出消息类型
  //取出消息发送者id
  //获取发送者对象
  JCMediaChannelParticipant partp = mediaChannel.getParticipant("消息发送者id");
  if (// 主播同意音频连麦) {
      if partp != nil {
          //设置成员状态
          mediaChannel.setCustomState(STATE_AUDIO_JOIN, partp);
      }
  }
}

成员状态设置后会收到 onParticipantUpdate 回调,该回调会上报变化的成员以及变化的属性

/// <summary>
/// 成员更新回调
/// </summary>
/// <param name="participant">成员对象</param>
/// <param name="changeParam">更新标识类</param>
void onParticipantUpdate(JCMediaChannelParticipant participant, JCMediaChannelParticipant.ChangeParam changeParam);

示例代码

public void onParticipantUpdate(JCMediaChannelParticipant participant, JCMediaChannelParticipant.ChangeParam changeParam) {
    if (participant.isSelf && participant.isAudience && participantChangeParam.customState) {
        if (participant.isAudioJoiner) { //音频连麦成员
            mediaChannel.enableUploadVideoStream(false);
            mediaChannel.enableUploadAudioStream(true);
        } else { //普通成员
            mediaChannel.enableUploadVideoStream(false);
            mediaChannel.enableUploadAudioStream(false);
        }
    }

2. 踢出成员

直播中,主播可以调用下面的接口踢出成员

/// <summary>
/// 踢人
/// </summary>
/// <param name="participant">成员</param>
/// <returns>调用结果</returns>
public bool kick(JCMediaChannelParticipant participant)

示例代码

JCMediaChannelParticipant partp = mediaChannel.getParticipant("userId");
mediaChannel.kick(partp);

3. 发送消息

如果想在直播中发送消息,可以调用下面的接口

/// <summary>
/// 频道中发送消息,当 toUserId 不为 null 时,content 不能大于 4k
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="content">消息内容</param>
/// <param name="toUserId">接收方成员的userid,值为null发送给所有人</param>
/// <returns>是否发送成功</returns>
public bool sendMessage(string type, string content, string toUserId)

其中,消息类型(type)为自定义类型。

示例代码

public void sendMessage() {
    // 发送给所有成员
    mediaChannel.sendMessage("text", "content", null);
    // 发送给某个成员
    mediaChannel.sendMessage("text", "content", "接收者id");
}

当频道中的其他成员收到消息时,会收到 onMessageReceive 回调

/// <summary>
/// 接收频道消息的回调
/// </summary>
/// <param name="type">消息类型</param>
/// <param name="content">消息内容</param>
/// <param name="fromUserId">消息发送成员userId</param>
void onMessageReceive(string type, string content, string fromUserId);