# 实现互动直播

本章将介绍如何实现语音互动直播,语音互动直播的 API 调用时序见下图:

../../../../_images/multiaudioworkflow.jpg

# 初始化

调用 JCMediaDevice.create (opens new window)JCMediaChannel.create (opens new window) 以初始化实现多方通话需要的模块:

/// 声明对象
JCMediaDevice mMediaDevice;
JCMediaChannel mMediaChannel;

/// 初始化函数
public bool initialize(Context context) {

    /// 1. 媒体类
    mMediaDevice = JCMediaDevice.create(mClient, this);
    /// 2. 媒体通道类
    mMediaChannel = JCMediaChannel.create(client, mediaDevice, this);
}

其中:

JCMediaDeviceCallback 中的主要方法如下

//摄像头变化
public void onCameraUpdate()
{
}
//音频输出变化
public void onAudioOutputTypeChange(string audioOutputType)
{
}

JCMediaChannelCallback 中的主要方法如下

//自身状态变化回调
public void onMediaChannelStateChange(JCMediaChannelState state, JCMediaChannelState oldState)
{
}
//频道属性变化
public void onMediaChannelPropertyChange(JCMediaChannel.PropChangeParam propChangeParam)
{
}
//加入频道结果回调
public void onJoin(bool result, JCMediaChannelReason reason, string channelId)
{
}
//离开频道结果回调
public void onLeave(JCMediaChannelReason reason, string channelId)
{
}
//解散频道结果回调
public void onStop(bool result, JCMediaChannelReason reason)
{
}
//查询频道结果回调
public void onQuery(int operationId, bool result, JCMediaChannelReason reason, JCMediaChannelQueryInfo queryInfo)
{
}
//成员加入回调
public void onParticipantJoin(JCMediaChannelParticipant participant)
{
}
//成员离开回调
public void onParticipantLeft(JCMediaChannelParticipant participant)
{
}
//成员更新回调
public void onParticipantUpdate(JCMediaChannelParticipant participant, JCMediaChannelParticipant.ChangeParam changeParam)
{
}
//成员声音变化
public void onParticipantVolumeChange(JCMediaChannelParticipant participant)
{
}

# 角色设置

加入频道前要先进行角色的设置。其中角色设置包括主播和观众。 角色值可以根据 JCMediaChannel.CustomRole (opens new window) 枚举值进行自定义,例如

//自定义主播角色
JCMediaChannelCustomRole ROLE_BROASCASTER = JCMediaChannelConstants.CUSTOM_ROLE_0;
//自定义观众角色
JCMediaChannelCustomRole ROLE_AUDIENCE = JCMediaChannelConstants.CUSTOM_ROLE_1;

调用 setCustomRole (opens new window) 设置自己的角色以进入频道。

/// 设置角色,participant(第二个参数) 值为 null 代表设置自身的角色
mediaChannel.setCustomRole(ROLE_BROASCASTER, null);

# 加入频道

  1. 调用 enableUploadAudioStream (opens new window) 开启音频流。
/// 1. 开启音频流
mMediaDeviceChannel.enableUploadAudioStream(true);
  1. 创建并加入频道,需要传入 channelIdOrUriJCMediaChannel.JoinParam (opens new window)

    • channelIdOrUri 表示频道 ID 或频道 Uri。

    • JCMediaChannelJoinParamuriMode 参数设置为 true 时表示传入频道 Uri,设置其他参数时表示传入频道 ID。传入相同的频道 ID 或相同的频道 Uri 的用户会进入同一个频道。

    mMediaChannel.join("222", null);
    
  2. 加入频道后自身会收到 onJoin (opens new window) 回调。其他成员会收到 onParticipantJoin (opens new window) 回调。

public void onJoin(bool result, JCMediaChannelReason reason, String channelId) {
    if (result) {
        /// 加入频道成功
    } else {
        /// 加入频道失败
    }
}

# 离开频道

调用 leave (opens new window) 方法可以离开当前频道。

mMediaChannel.leave();

在多方视频通话中,离开频道还需要调用 stopVideo (opens new window) 移除视频画面。

mParticipant.stopVideo();

离开频道后,自身收到 onLeave (opens new window) 回调,其他成员同时收到 onParticipantLeft (opens new window) 回调

/// 离开频道结果回调

public void onLeave(JCMediaChannelReason reason, String channelId) {
    ...
    /// 销毁视频画面
    mParticipant.stopVideo();
}

# 解散频道

如果想解散频道,可以调用下面的接口,此时所有成员都将被退出。

/// 结束频道
mMediaChannel.stop();

在多方视频通话中,离开频道还需要调用 stopVideo (opens new window) 移除视频画面。

mParticipant.stopVideo();

解散频道后,发起结束的成员收到 onStop (opens new window) 回调,其他成员同时收到 onLeave (opens new window) 回调。 解散失败原因枚举值请参考 MediaChannelReason (opens new window)

public void onStop(bool result, JCMediaChannelReason reason) {
    /// 销毁视频, canvas 为 JCMediaDeviceVideoCanvas 对象实例
    mParticipant.stopVideo();
    canvas = null;
}