跳到主要内容

实现低延迟直播

本教程介绍如何使用融云音视频核心能力库 RCUnityRTCLib 实现音视频直播业务。

提示

房间人数上限

考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。

环境要求

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 或以上版本。

iOS

  • iOS 9.0 及以上。
  • Xcode 9.0 或以上版本。

步骤 1:服务开通

融云开发者账户是使用融云 SDK 产品的必要条件。在开始之前,请先注册开发者账户。注册后,控制台将自动为你创建一个应用,默认为开发环境应用,使用国内数据中心。请获取该应用的 App Key,在本教程中使用。

您在融云创建的应用默认不会启用音视频服务。在使用融云提供的任何音视频服务前,您需要前往控制台,为应用开通音视频服务和音视频直播服务。

具体步骤请参阅 开通音视频服务

提示

服务开通、关闭等设置完成后 30 分钟后生效。

步骤 2:SDK 导入

您需要导入融云音视频核心能力库 RCUnityRTCLib,和 RTC 业务所依赖的即时通讯能力库 RCUnityIMLib。请前往[融云官网 SDK 下载页面]获取相关 SDK。

  1. 在项目 Assets 目录右键单击选择 Import Package > Custom Package
  2. 选择 RCUnityIMLib.unitypackageRCUnityRTCLib.unitypackage 资源包,在 Import Unity Package 对话框选择 All,并执行 Import 导入全部资源。
  3. 在 Unity 项目的 Build Settings 对话框切换当前平台到 iOS、Android,然后执行 Build And Run

导入命名空间

使用 SDK 功能前,需要导入以下命名空间:

using cn_rongcloud_im_unity;
using cn_rongcloud_rtc_unity;

步骤 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

  1. 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.CAMERA" />
    <!-- 音频采集需要 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  2. 如果您的应用需要支持 Android 6.0(API 级别 23)或更高版本的设备,您还需要在 App 用户使用对应功能时请求摄像头(CAMERA)、麦克风(RECORD_AUDIO)权限。详见 Android 开发者官方文档运行时权限请求权限的工作流

iOS

  1. 音频通话需要用到麦克风权限,请在工程的 info.plist 中添加如下键值:
    • Privacy - Microphone Usage Description
    • Privacy - Camera Usage Description
  2. 请将工程中 Target -> Signing & Capabilities -> Background Modes 如下内容勾选:
    • Audio, AirPlay, and Picture in Picture
    • Remote notifications

步骤 5:初始化

音视频 SDK RCUnityRTCLib 依赖 RCUnityIMLib 做作为信令通道,所以这两个 SDK 需要分别进行初始化。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。

// RCUnityIMLib 初始化,SDK ≧ 5.2.4
RCIMEngineOptions options = new RCIMEngineOptions();
RCIMEngine imEngine = RCIMEngine.create(appkey, options);

// RCUnityRTCLib 初始化
var engineSetup = RCRTCEngineSetup.Builder().Create().Build();
RCRTCEngine.Create(engineSetup);

关于初始化的更多配置请参见初始化

不使用音视频会议业务时需要调用 Destory 销毁引擎。

imEngine.Destory();
Engine.Destory();

步骤 6:连接 IM 服务

音视频用户之间的信令传输依赖于融云的即时通信(IM)服务,因此需要先调用 Connect 与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 DisconnectLogout 断开该连接。

engine.connect(token,timeout);

回调方法参见 IMLib 连接文档。

主播端

多人之间想要发起音视频通话,需要加入同一个音视频房间。对于直播需求来讲,房间类型需选择 LIVE_AUDIO_VIDEOLIVE_AUDIO,即音视频直播间或纯音频直播间。加入房间的角色也分为主播(BROADCASTER)和观众(AUDIENCE),下面就这两种身份,分别进行说明。

步骤 6.1:加入房间

  1. 构建 RCRTCRoomSetup,指定当前用户身份,调用 RCRTCEngine.JoinRoom() 加入房间。通过 OnRoomJoined 回调判断是否加入房间成功。

    Engine.OnRoomJoined += (int code, string message) =>{
    // code: 错误码 0, 成功
    };
    var setup = RCRTCRoomSetup.Builder.Create()
    .WithRole(RCRTCRole.LIVE_BROADCASTER)
    .WithMediaType(RCRTCMediaType.AUDIO_VIDEO)
    .Build();
    Engine.JoinRoom("Your_Room_ID", setup);
  2. 进入房间成功后调用注册房间信息回调。

    名称说明
    OnRoomJoined加入房间回调
    OnRoomLeft离开房间回调
    OnUserJoined有人加入房间
    OnUserOffline房间内有人断线
    OnUserLeft有人离开房间
    OnRemotePublished房间内用户发布资源
    OnRemoteUnpublished房间内用户取消发布资源
    OnRemoteLiveMixPublished房间内直播合流资源发布
    OnRemoteLiveMixUnpublished房间内直播合流资源取消发布
提示

客户端通过 JoinRoom() 传入的直播间 ID 来加入不同房间。房间不需要客户端创建或销毁,融云服务若发现该房间不存在时会自动创建。当所有主播(只有观众不算)离开持续 24 小时后,服务会自动销毁该房间。

步骤 6.2:发布音视频流

  1. 调用 EnableMicrophone() 开启麦克风。不开启麦克风,会导致对端听不到本地声音。

  2. 调用 EnableCamera() 开启摄像头。不开启摄像头,会导致对端看不到本地图像。

  3. 调用 RCRTCEngine 中的 Publish 方法发布默认音视频资源。

    // 开启麦克风
    Engine.EnableMicrophone(true);
    // 开启前置摄像头
    Engine.EnableCamera(true, RCRTCCamera.FRONT);
    // 发布默认音频流
    int ret = Engine.Publish(RCRTCMediaType.AUDIO_VIDEO);
    if (ret != 0) {
    // 发布资源异常
    }
  4. 调用 RCRTCEngine 下的 SetLocalView 方法设置本地视频的预览。

    RCRTCView localVideoView;
    Engine.SetLocalView(localVideoView);

步骤 6.3:主播订阅房间内其他主播的资源

  1. 调用 RCRTCEngine 下的 Subscribe 方法订阅房间内其他主播的资源,在主播连麦的场景下会用到该方法,当远端主播发布资源时,会通过 OnRemotePublished() 回调通知,需要订阅音视频流并显示视图。

    /**
    * 订阅远端用户资源
    */
    Engine.OnRemotePublished = (remoteUserId, mediaType) => {
    Engine.OnSubscribed = (subRemoteUserId, subMediaType, code, message) => {
    };
    Engine.Subscribe(remoteUserId, mediaType);
    };
  2. 根据 RCRTCEngine 下的 OnRemotePublished 通知,获取房间内其他主播推送的流,获得的视频流可用于本地的预览。

    RCRTCView remoteVideoView;
    Engine.SetRemoteView(remoteUserId, remoteVideoView);

观众端

步骤 7.1:加入房间

调用 RCRTCEngine.JoinRoom() 以观众身份加入房间。通过 OnRoomJoined 回调判断是否加入房间成功。

Engine.OnRoomJoined = (int code, string message) => {
// code: 错误码 0, 成功
};
var setup = RCRTCRoomSetup.Builder.Create()
.WithRole(RCRTCRole.LIVE_AUDIENCE)
.WithMediaType(RCRTCMediaType.AUDIO_VIDEO)
.Build();
Engine.JoinRoom("Your_Room_ID", setup);

步骤 7.2:观众观看直播

  1. 观众获取直播合流方式,可以使用 RCRTCEngine.SubscribeLiveMix 方法。

    Engine.OnLiveMixSubscribed = (RCRTCMediaType mediaType, int code, string message) => {
    // mediaType: 合流资源类型
    // code: 错误码 0, 成功
    // message: 错误信息
    };
    // 订阅大流
    bool subTinyVideo = false;
    Engine.SubscribeLiveMix(RCRTCMediaType.AUDIO_VIDEO, subTinyVideo);
  2. 调用 RCRTCEngine#SetLiveMixView 观看直播。

    RCRTCView liveMixView;
    Engine.SetLiveMixView(liveMixView);