2021年初,Clubhouse引爆了在线语音聊天应用,字节跳动、小米、快手、映客等国内泛娱乐社交厂商已纷纷跟进,那么搭建一个类Clubhouse的语音聊天软件难吗?

其实Clubhouse的技术原理非常简单,就是实时语音通话+麦位管理。ZEGO即构科技所的语音聊天方案就完整的提供了上述功能,目前即构提供了体验Demo及源码,让你可以零基础快速搭建一个语音聊天软件。

下面先来看看Android语音聊天应用的搭建流程:

 

一、功能说明

语音聊天房应用的实现,主要由业务系统和移动/Web 客户端组成。其中业务系统需要实现房间管理、麦位管理、音频流和麦位关联关系管理等功能,客户端需要实现登录/登出房间、拉流/停止拉流、上麦推流/停止推流下麦等功能,还可以根据需要使用房间信息通道实现 IM 功能。

1、业务系统功能

房间管理

主要负责房间列表的维护。

创建房间:用户登录业务系统后,可以创建房间,创建房间后房间列表要做新增操作。

销毁房间:所有用户退出房间后,需要销毁房间,销毁房间后房间列表要做删除操作。

麦位管理

主要负责根据业务场景定义房间的麦位数量,以及当前房间所有麦位的状态管理。

用户进入房间后,只有空闲状态的麦位可以上麦。

用户上麦后,需要修改麦位状态为非空闲状态。

用户停止推流下麦后,要重置麦位状态。

音频流管理

主要负责管理房间内音频流和麦位的关联关系。

只有当前房间内非空闲状态麦位的流可以拉。

 

2、客户端功能

登录/登出房间

用户进入客户端后,选择房间列表中的房间或者自行创建房间,然后登录房间。

用户退出当前语聊房时,需要登出房间。

拉流/停止拉流

用户登录房间后或收到流新增消息时,需要根据流 Id 判断是否是本房间非空闲状态麦位推的流,如果是则发起拉流。

用户收到流删除消息或者登出房间之前,要停止拉流。

上麦推流/停止推流下麦

用户登录房间后,如果有非空闲状态的麦位,可以选择上麦。

用户上麦成功发起推流,成为麦上用户。

用户停止推流后下麦,成为观众。

房间信令互动

用户可以通过房间信令通道,发送文字消息参与互动。

 

二、实现流程

以下为语音聊天房的实现时序图,你可以参考时序图来实现。

  • 用户 A 创建房间

调用业务系统创建房间接口创建房间,创建房间成功后业务系统需要返回的当前创建房间的 ID。

  • 用户 A 登录业务房间

调用业务系统登录房间接口登录房间,登录成功后业务系统需要更新房间列表,并返回房间麦位信息列表,麦位信息需要包含麦位 Id、是否空闲状态等。

  • 用户 B 查询房间列表

调用业务系统获取房间列表信息接口获取房间列表,调用成功后业务系统需要返回当前房间信息列表,房间信息需要包含房间 ID 等。

  • 用户 B 登录业务房间

用业务系统登录房间接口登录房间,登录成功后业务系统需要更新房间列表,并返回房间麦位信息列表,麦位信息需要包含麦位 Id、是否空闲状态等。

  • 用户 A 登录 SDK 房间

依次调用 Express Audio SDK 的初始化 SDK 接口、设置事件回调接口、登录房间接口,登录 SDK 房间,登录成功后,会收到房间流更新回调。

  • 用户 A 上麦推流

选择空闲状态的麦位调用业务系统上麦接口上麦,业务系统更新麦位状态为非空闲状态,并返回上麦结果信息,上麦结果信息需要包含使用的麦位 Id、为麦位分配的推流 Id 等信息。收到请求上麦结果返回数据后,根据返回的推流 ID 调用 Express Audio SDK 推流接口开始推流,推流后会收到推流结果回调。

  • 用户 B 登录 SDK 房间

依次调用 Express Audio SDK 的初始化 SDK 接口、设置事件回调接口、登录房间接口,登录 SDK 房间,登录成功后,会收到房间流更新回调。

  • 用户 B 收到 Express Audio SDK 流更新回调拉流

登录 SDK 房间成功后,会收到房间流更新回调,如果是流新增,调用业务系统查询接口查询流 ID 是否为当前房间麦位分配的推流 ID,如果是则调用 Express Audio SDK 拉流接口拉流。

  • 用户 B 上麦推流

选择空闲状态的麦位调用业务系统上麦接口上麦,业务系统更新麦位状态为非空闲状态,并返回上麦结果信息,上麦结果信息需要包含使用的麦位 Id、为麦位分配的推流 Id 等信息。收到请求上麦结果返回数据后,根据返回的推流 ID 调用 Express Audio SDK 推流接口开始推流,推流后会收到推流结果回调。

  • 用户 A 收到 Express Audio SDK 流更新回调拉流

登录 SDK 房间成功后,会收到房间流更新回调,如果是流新增,调用业务系统查询接口查询流 ID 是否为当前房间麦位分配的推流 ID,如果是则调用 Express Audio SDK 拉流接口拉流。

  • 用户 A 请求下麦后停止推流

调用业务系统下麦接口下麦,业务系统更新麦位为空闲状态,用户下麦成功后成为线下观众,停止推流。

  • 停止拉流、登出房间

调用 Express Audio SDK 停止拉流接口停止拉所有正在拉的流、调用登出房间接口登出 SDK 房间。

  • 登出业务房间

调用业务系统登出房间接口登出业务房间。

 

三、操作步骤

 

1、创建/销毁 Engine

在使用 Express Audio SDK 之前,需要初始化 Express Audio SDK。由于初始化操作 SDK 内部处理的流程较多,建议开发者在 App 启动时进行,详情请参考 快速开始 - 实现流程 的 “2.1 创建引擎”。

/** 定义 SDK 引擎对象 */
ZegoExpressEngine engine;
/** 填写 appID 和 appSign */
long appID = ;  // 请通过官网注册获取,格式为 123456789L
String appSign = ;  //64个字符,请通过官网注册获取,格式为"0123456789012345678901234567890123456789012345678901234567890123"
/** 初始化SDK,使用测试环境,通用场景接入 */
engine = ZegoExpressEngine.createEngine(appID, appSign, true, ZegoScenario.GENERAL, getApplication(), null);
/** 销毁 SDK */
ZegoExpressEngine.destroyEngine(null);

 

2、设置事件回调

可以根据场景需要,在初始化 SDK 后监听想要关注的事件通知,比如用户加入房间,房间流更新等等。

// 设置事件回调,监听房间流更新
engine.setEventHandler(new IZegoEventHandler() {
    @Override
    public void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoStream> streamList) {
        super.onRoomStreamUpdate(roomID, updateType, streamList);
        if (ZegoUpdateType.ADD == updateType) {
           // 流新增
        } else if (ZegoUpdateType.DELETE == updateType) {
           // 流删除
        }
    }
});

 

3、登录/登出房间

用户上麦推流之前,需要先登录房间,在收到登录房间成功的回调后可以直接调用 loginRoom 接口进行推拉流操作,详情请参考 快速开始 - 实现流程 的 “2.2 登录房间”。

/** 创建用户 */
ZegoUser user = new ZegoUser("Anchor1");
/** 开始登陆房间 */
engine.loginRoom("LiveRoom", user);
/** 登出房间 */
engine.logoutRoom("room1");
 

4、开始/停止推流

调用 startPublishingStream 接口,可以向远端用户发送本端的音视频流。如果不需要继续推流,请调用 stopPublishingStream 停止推流,详情请参考 快速开始 - 实现流程 的 “2.3 推流”。

/** 开始推流 */
engine.startPublishingStream("stream1");
/** 停止推流 */
engine.stopPublishingStream();

 

5、拉流/停止拉流

调用 startPlayingStream 进行拉流,如果不需要继续拉流,请调用 stopPlayingStream 停止拉流,详情请参考 快速开始 - 实现流程 的 “2.4 拉流”。

/**
 *  开始拉流
 */
engine.startPlayingStream("stream1");
/** 停止拉流 */
engine.stopPlayingStream(streamID);
 

以上就是基于ZEGO SDK 实现Android语音聊天应用的流程,即构还提供了免费源码,让开发实现2小时快速集成上线,扫码即可体验Demo,欢迎进入 ZEGO官网 获取源码。

 

Logo

致力于链接即构和开发者,提供实时互动和元宇宙领域的前沿洞察、技术分享和丰富的开发者活动,共建实时互动世界。

更多推荐