iOS + Android

最近更新时间:2020-04-14 16:25:14

功能介绍

TXLivePusher 和 TXLivePlayer 这两个基础组件可以比较容易的实现推流和拉流功能,但如果想要实现复杂的直播连麦功能,就需要借助我们提供给您的 MLVBLiveRoom 组件,该组件基于云直播(LVB)和即时通信(IM)两个 PAAS 服务组合而成,支持:

  • 主播创建新的直播间开播,观众进入直播间观看。
  • 主播和观众进行视频连麦互动。
  • 两个不同房间的主播 PK 互动。
  • 每一个直播间都有一个不限制房间人数的聊天室,支持发送各种文本消息和自定义消息,自定义消息可用于实现弹幕、点赞和礼物。

功能体验

我们提供了 iOS、Android 以及微信小程序三个平台上的直播连麦体验,它们均是使用 MLVBLiveRoom 组件实现的直播加连麦功能:

  • iOS
    进入 App Store 安装应用“小直播”,注册一个账号即可开始体验。
  • Android
    下载 apk 安装包,安装“小直播”,注册一个账号即可开始体验。
  • 微信小程序
    打开微信,选择【发现】>【小程序】,搜索“腾讯视频云”,单击“手机直播”功能即可体验。

代码对接

Step1. 下载 LiteAVSDK 和 MLVBLiveRoom 组件

移动直播提供的连麦能力需要依赖三个组件:

  • LiteAVSDK:闭源,负责直播推流,直播拉流,以及连麦视频通话功能。
  • TIMSDK:闭源,负责构建直播聊天室,以及聊天室中用户之间的消息传输功能。
  • MLVBLiveRoom:开源,基于 LiteAVSDK 和 TIMSDK 搭建一个支持连麦互动和消息互动的“直播间”。

我们已将上述组件均托管在 Github 上,clone 下来便可使用,关键组件的具体获取路径如下表所示:

所属平台 LiteAVSDK TIMSDK MLVBLiveRoom 组件 示例代码
iOS MLVBSDK TIMSDK MLVBLiveRoom SimpleCode
Android MLVBSDK TIMSDK MLVBLiveRoom SimpleCode

Step2. 申请 License

下载 LiteAVSDK 后需要 License 授权才能使用,请阅读 License 申请 了解 License 的申请方法和使用方法。

  • iOS
    建议在[AppDelegate application:didFinishLaunchingWithOptions:]中添加:
    [TXLiveBase setLicenceURL:LicenceUrl key:Key];
  • Android
    建议在 application 中添加:
    TXLiveBase.getInstance().setLicence(context, LicenceUrl, Key);

Step3. 购买连麦套餐包

由于连麦功能会使用到高速专线来降低音视频传输延迟,这部分功能需要额外购买套餐包才能开通,否则移动直播的各端 SDK 只能使用云直播的普通服务(推流和拉流),并不能开启连麦功能。

说明:

  • 默认开通连麦服务需要先购买正式的连麦套餐包(非体验包),开通后可选择继续购买套餐包进行消费抵扣,也可以按照后付费日结计费进行结算。
  • 若您购买的套餐包为体验包,用尽后次日会自动停止连麦服务,超出部分仍会按照后付费计费。

Step4. 在应用管理中添加一个新的应用

进入【云直播控制台】>【直播SDK】>【应用管理】,单击【创建应用】。待应用创建完成后,记录其 SDKAPPID 信息。

说明:

该操作的目的是创建一个即时通信 IM 应用,并将当前直播账号和该即时通信 IM 应用绑定起来。即时通信 IM 应用能为小直播 App 提供聊天室和连麦互动的能力。

Step5. 登录房间服务

MLVBLiveRoom 单靠一个终端的组件无法独自运行,它依赖一个后台服务为其实现房间管理和状态协调,这个后台服务我们称之为房间服务(RoomService)。而要使用这个房间服务,MLVBLiveRoom 就需要先进行登录(login)。

MLVBLiveRoom 的 login 函数需要指定相关参数:

参数 类型 填写方案
sdkAppID 数字 当前应用的 AppID,在 Step4 中可以获取到。
userID 字符串 当前用户在您的帐号系统中的 ID。
userName 字符串 用户名(昵称)。
userAvatar 字符串 用户头像的 URL 地址。
userSig 字符串 登录签名,计算方法请参见 计算 UserSig
说明:

  • 由于 login 是一个需要跟后台服务器通讯的过程,建议等待 login 函数的异步回调后再调用其他函数。
  • 后台接口限制并发为每秒100次请求,若您有高并发请求请提前 联系我们 处理,避免影响服务调用。

Step6. 获取房间列表(非必需)

说明:

如果您希望使用自己的房间列表,该步骤可跳过,但需要您在 Step7 中自行指定 roomID。为避免房间号重复,建议使用主播的 userID 作为 roomID。

不管是主播还是观众都需要有一个房间列表,调用 MLVBLiveRoom 的 getRoomList 接口可以获得一个简单的房间列表:

  • 当主播通过createRoom创建一个新房间时,房间列表中会相应地增加一条新的房间信息。
  • 当主播通过exitRoom退出房间时,房间列表中会移除该房间。

列表中每个房间都有对应的 roomInfo,由主播通过createRoom创建房间时传入,为提高扩展性,建议将 roomInfo 定义为 JSON 格式。

Step7. 主播开播

主播开播前,需要先调用 MLVBLiveRoom 中的 startLocalPreview 接口开启本地摄像头预览,该函数需要传入 view 对象用于显示摄像头的视频影像,这期间 MLVBLiveRoom 会申请摄像头使用权限。同时,主播也可以对着摄像头调整美颜和美白的具体效果。
然后调用 createRoom 接口,MLVBLiveRoom 会在后台的房间列表中新建一个直播间,同时主播端会进入直播状态。

说明:

为避免房间号重复,建议使用主播的 userID 作为 roomID。如果您不手动设置 roomID,后台将会自动为您分配一个 roomID。
如果您想要管理房间列表,可以先由您的服务器确定 roomID,再通过 createRoom、enterRoom 和 exitRoom 接口使用 MLVBLiveRoom 的连麦能力。

Step8. 观看直播

观众通过 MLVBLiveRoom 中的 enterRoom 接口可以进入直播间观看视频直播,enterRoom 函数需要传入 view 对象用于显示直播流的视频影像。

进入房间后,通过调用 getAudienceList 接口可以获取观众列表。如果少于30名观众,列表会展示全部观众信息。如果多于30名观众,列表仅展示新进入房间的30名观众的信息。

Step9. 弹幕消息

MLVBLiveRoom 包装了 TIMSDK 的消息发送接口,您可以通过 sendRoomTextMsg 函数发送普通的文本消息(用于弹幕),也可以通过 sendRoomCustomMsg 发送自定义消息(用于点赞,送花等等)。

注意:

腾讯云 IM 的直播聊天室,每秒钟最多可以收取40条的消息。如果您以高于40条/次的速度刷新 UI 上的弹幕界面,很容易导致 CPU 100%,请注意控制刷新频率,避免高频刷新。

Step10. 观众与主播连麦

步骤 角色 详情
第一步 观众 观众调用requestJoinAnchor()向主播发起连麦请求。
第二步 主播 主播会收到MLVBLiveRoomDelegate#onRequestJoinAnchor(AnchorInfo, String)通知,之后可以展示一个 UI 提示,询问主播要不要接受连麦。
第三步 主播 主播调用responseJoinAnchor()确定是否接受观众的连麦请求。
第四步 观众 观众会收到MLVBLiveRoomDelegate.RequestJoinAnchorCallback回调通知,得知请求是否被同意。
第五步 观众 观众如果请求被同意,则调用 startLocalPreview() 开启本地摄像头,如果 App 还没有取得摄像头和麦克风权限,会触发 UI 提示用户授权摄像头和麦克风的使用权限。
第六步 观众 观众调用joinAnchor()正式进入连麦状态。
第七步 主播 当观众进入连麦状态后,主播就会收到MLVBLiveRoomDelegate#onAnchorEnter(AnchorInfo)通知。
第八步 主播 主播调用startRemoteView()就可以看到连麦观众的视频画面。
第九步 观众 如果直播间里已经有其他观众正在跟主播进行连麦,那么新加入的这位连麦观众也会收到onAnchorJoin()通知,用于展示(startRemoteView())其他连麦者的视频画面。
第九步 主播或观众 主播或观众随时都可以通过quitJoinAnchor()接口退出连麦状态,同时,主播还可以通过kickoutJoinAnchor()接口移除连麦观众。
说明:

MLVBLiveRoom 在设计上最多支持10人同时连麦,但出于兼容低端 Android 终端和实际体验效果的考虑,建议将同时连麦人数控制在6人以下。

Step11. 主播间跨房间 PK

主播间跨房 PK 常被用于活跃直播平台的氛围,提升打赏频率,对平台的主播人数有一定要求。目前常见的主播 PK 方式是将所有愿意 PK 的主播“圈”在一起,再后台进行随机配对,每次 PK 都有一定时间要求,例如5分钟,超过后即结束 PK 状态。
由于我们暂时未在 MLVBLiveRoom 的房间服务里加入配对逻辑,因此目前仅提供了基于客户端 API 接口的简单 PK 流程,您可以通过即时通信 IM 服务的消息下发 REST API 接口,由您的配对服务器,将配对开始、配对结束等指令发送给指定的主播,从而实现服务器控制的目的。如果采用此种控制方式,下述步骤中的第三步实现为默认接受即可。

步骤 角色 详情
第一步 主播 A 主播 A 调用requestRoomPK()向主播 B 发起连麦请求。
第二步 主播 B 主播 B 会收到MLVBLiveRoomDelegate#onRequestRoomPK(AnchorInfo)回调通知。
第三步 主播 B 主播 B 调用responseRoomPK()确定是否接受主播 A 的 PK 请求。如果采用服务器配对的 PK 方案,此处可以默认接受,不需要由主播 B 来决策。
第四步 主播 B 主播 B 在接受主播 A 的请求后,即可调用startRemoteView()来显示主播 A 的视频画面。
第五步 主播 A 主播 A 会收到MLVBLiveRoomDelegate.RequestRoomPKCallback回调通知,可以得知请求是否被同意,如果请求被同意,则可以调用startRemoteView()显示主播 B 的视频画面。
第六步 主播 A或 B 主播 A 或 B 均可以通过调用quitRoomPK()接口结束 PK 状态。

常见问题

移动直播是不是使用 RTMP 协议进行连麦?

不是。腾讯云采用了两种传输通道才实现了直播 + 连麦功能:

  • 直播采用标准的 HTTP-FLV 协议,使用标准 CDN 线路,没有并发观看人数的限制,且带宽成本很低,但延迟一般在3s以上。
  • 连麦采用 UDP 协议,使用专用加速线路,延迟一般在500ms以内,但由于线路成本较高,因此采用连麦时长进行计费。

通道 直播通道 连麦通道
通讯延迟 ≥ 3s ≤ 500ms
底层协议 HTTP-FLV 协议 UDP 协议
价格/费用 按带宽计费 按时长计费
最高并发 无上限 ≤ 10人
TXLivePusher setVideoQuality 为 SD、HD、FHD setVideoQuality 为 MAIN_PUBLISHER、SUB_PUBLISHER
TXLivePlayer PLAY_TYPE_LIVE_FLV PLAY_TYPE_LIVE_RTMP_ACC
播放URL 普通的 FLV 地址 带防盗链签名的 RTMP-ACC 地址
目录