实现低延迟直播
本教程介绍如何使用融云纯音频核心能力库 RCUnityAudioRTCLib
实现纯音频直播业务。
环境准备
Android
- (SDK ≧ 5.6.3)使用 Android 5.0(API 21)或更高版本;
- (SDK < 5.6.3)使用 Android 4.4(API 19)或更高版本;推荐使用 Android 5.0(API 21)。
- Android Studio 3.0 或以上版本。
- 由于手机性能及带宽影响,建议单次纯音频通话或房间内不超过 32 人。
iOS
- iOS 9.0 及以上。
- Xcode 9.0 或以上版本。
- 由于手机性能及带宽影响,建议单次纯音频通话或房间内不超过 32 人。
步骤 1:开通服务
融云开发者账户是使用融云 SDK 产品的必要条件。在开始之前,请先注册开发者账户。注册后,控制台将自动为你创建一个应用,默认为开发环境应用,使用国内数据中心。请获取该应用的 App Key,在本教程中使用。
您在融云创建的应用默认不会启用音视频服务。在使用融云提供的任何音视频服务前,您需要前往控制台,为应用开通音视频服务。
具体步骤请参阅开通音视频服务。
服务开通、关闭等设置完成后 30 分钟后生效。
步骤 2:导入 SDK
您需要导入融云纯音频核心能力库 RCUnityAudioRTCLib
,和 RTC 业务所依赖的即时通讯能力库 RCUnityIMLib
。请前往融云官网 SDK 下载页面获取相关 SDK。
- 在项目 Assets 目 录右键单击选择 Import Package > Custom Package。
- 选择 RCUnityIMLib.unitypackage 和 RCUnityAudioRTCLib.unitypackage 资源包,在 Import Unity Package 对话框选择 All,并执行 Import 导入全部资源。
- 在 Unity 项目的 Build Settings 对话框切换当前平台到 iOS 或 Android,然后执行 Build And Run。
导入命名空间
使用 SDK 功能前,需要导入以下命名空间:
using cn_rongcloud_im_unity;
using cn_rongcloud_rtc_unity;
具体步骤请参阅导入 SDK。
步骤 3:代码混淆(Android)
若开发者发布的 App 启用代码混淆,请务必在 app/proguard-rules.pro 文件添加如下配置:
-keepattributes Exceptions,InnerClasses
-keepattributes Signature
#RongRTCLib
-keep public class cn.rongcloud.** {*;}
#RongIMLib
-keep class io.rong.** {*;}
-keep class cn.rongcloud.** {*;}
-keep class * implements io.rong.imlib.model.MessageContent {*;}
-dontwarn io.rong.push.**
-dontnote com.xiaomi.**
-dontnote com.google.android.gms.gcm.**
-dontnote io.rong.**
-ignorewarnings
步骤 4:权限配置
Android
-
在
AndroidManifest.xml
中声明 SDK 需要的所有权限。<!-- 音视频需要网络权限 和 监听网络状态权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 音频采集需要 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> -
如果您的应用需要支持 Android 6.0(API 级别 23)或更高版本的设备,您还需要在 App 用户使用对应功能时请求麦克风(
RECORD_AUDIO
)权限。详见 Android 开发者官方文档运行时权限与请求权限的工作流。
iOS
- 音频通话需要用到麦克风权限,请在工程的 info.plist 中添加如下键值:
- Privacy - Microphone Usage Description
- 请将工程中 Target -> Signing & Capabilities -> Background Modes 如下内容勾选:
- Audio, AirPlay, and Picture in Picture
- Remote notifications
步骤 5:初始化
纯音频 SDK RCUnityAudioRTCLib
依赖 RCUnityIMLib
做作为信令通道,所以这两个 SDK 需要分别进行初始化。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。
// RCUnityIMLib 初始化,SDK ≧ 5.2.4
RCIMEngineOptions options = new RCIMEngineOptions();
RCIMEngine imEngine = RCIMEngine.create(appkey, options);
// RCUnityAudioRTCLib 初始化
var engineSetup = RCRTCEngineSetup.Builder().Create().Build();
RCRTCEngine.Create(engineSetup);
关于初始化的更多配置请参见初始化。
步骤 6:连接 IM 服务
音频用户之间的信令传输依赖于融云的即时通信(IM)服务,因此需要先调用 Connect
与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音频呼叫业务。当模块退出后调用 Disconnect
或 Logout
断开该连接。
engine.connect(token,timeout);
回调方法参见 IMLib 连接文档。
主播端
多人之间想要发起音频通话,需要加入同一个音频房间。加入房间的角色也分为主播(LIVE_BROADCASTER)和观众(LIVE_AUDIENCE),下面就这两种身份,分别进行说明。
步骤 6.1:加入房间
-
构建 RoomConfig,指定主播身份:
var roomSetup = RCRTCRoomSetup.Builder().Create().WithRole(RCRTCRole.LIVE_BROADCASTER).Build();
-
调用 RCRTCEngine 下的 JoinRoom 方法创建并加入一个直播房间:
RCRTCEngine.OnRoomJoined += (int code, string message) => {
// code: 错误码 0, 成功
};
var roomSetup = RCRTCRoomSetup.Builder().Create().WithRole(RCRTCRole.LIVE_BROADCASTER).Build();
RCRTCEngine.getInstance().JoinRoom("Your_Room_ID", roomSetup);提示客户端通过
JoinRoom()
传入的直播间 ID 来加入不同房间。房间不需要客户端创建或销毁,融云服务若发现该房间不存在时会自动创建。当所有主播(只有观众不算)离开持续 24 小时后,服务会自动销毁该房间 -
进入房间成功后调用注册房间信息回调。
名称 说明 OnRoomJoined 连接成功 OnRoomLeft 连接中 OnUserJoined 该账号在其他设备登录,导致当前设备掉线。 OnUserOffline 网络不可用 OnUserLeft token 非法,此时无法连接 im,需重新获取 token OnRemotePublished 用户被封禁 OnRemoteUnpublished 用户主动断开 OnRemoteLiveMixPublished 连接暂时挂起 OnRemoteLiveMixUnpublished 自动连接超时 OnLiveCdnAdded 直播 CDN 推流地址添加 OnLiveCdnRemoved 直播 CDN 移除
步骤 6.2:发布音频流
-
调用
EnableMicrophone()
开启麦克风。不开启麦克风,会导致对端听不到本地声音。 -
调用
RCRTCEngine
中的Publish
方法发布默认音频资源。// 开启麦克风
Engine.EnableMicrophone(true);
// 发布默认音频流
int ret = Engine.Publish();
if(ret != 0) {
// 发布资源异常
}
步骤 6.3:主播订阅房间内其他主播的资源
-
调用
RCRTCEngine
中的Subscribe
方法订阅会议参与者的资源,当远端 用户发布资源时,会通过OnRemotePublished
回调通知。Engine.Subscribe(remoteUserId);
-
在注册的房间事件回调中可根据业务需求监听远端用户发布的资源,并进行订阅。
Engine.OnRemotePublished = (remoteUserId) => {
// 房间内用户发布资源
Engine.Subscribe(remoteUserId);
}
观众端
步骤 7.1:加入房间
-
调用 RCRTCEngine.JoinRoom() 以观众身份加入房间。通过
OnRoomJoined
回调判断是否加入房间成功Engine.OnRoomJoined = (int code, string message) => {
// code: 错误码 0, 成功
// message: 错误信息描述
};
var roomSetup = RCRTCRoomSetup.Builder.Create().WithRole(RCRTCRole.LIVE_AUDIENCE).Build();
Engine.JoinRoom("Your_Room_ID", roomSetup);
步骤 7.2:观众订阅音频流
-
观众调用 RCRTCEngine.SubscribeLiveMix 获取直播合流。
Engine.OnLiveMixSubscribed = (int code, String message) => {
// code: 错误码 0 成功
// message: 错误描述
}
int ret = Engine.SubscribeLiveMix();