写点什么

一键调用,Get Android 实现视频连麦直播的核心原理,kotlin 常用高阶函数

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

RtmManager.instance.sendPeerMessage(hostId,


"{"cmd": "apply", "avatar": "userNickname"}"


)


}


//取消申请连麦


fun cancelApply() {


RtmManager.instance.sendPeerMessage( hostId,"{"cmd": "cancelApply"}"


)


}


//收到信令回调通知


override fun onP2PMessageReceived(var1: RtmMessage?, var2: String?) {


val params = JSONObject(var1.text)


when (params.get("cmd")) {


"acceptLine" -> {


//主播同意


}


"rejectLine" -> {


//主播拒绝


}


}


}

主播

//拒绝游客连麦


fun rejectLine(uid: String) {


RtmManager.instance.sendPeerMessage(uid, "{"cmd": "rejectLine"}"


)


}


//同意主播连麦


fun acceptLine(uid: String) {


RtmManager.instance.sendPeerMessage(uid, "{"cmd": "acceptLine"}"


)


}


override fun onP2PMessageReceived(var1: RtmMessage?, var2: String?) {


val params = JSONObject(var1.text)


when (params.get("cmd")) {


"apply" -> {


//收到游客申请连麦


}


"cancelApply" -> {


//游客取消申请连麦


}


}


}


以上,就完成了最简单的信令交互,实际业务场景中,会有更多更复杂的,只需商定好,通过 RTM 发送交互就行。


音视频推流





时序图


游客只观看主播的时候,是不需要发布音视频的,所以在加入房间后,将自己的身份设置为游客(CLIENT_ROLE_AUDIENCE)即可。申请连麦并且主播同意后,再将身份设置为(CLIENT_ROLE_BROADCASTER)就会自动发布音视频。这样就能与直播互动了。


anyRTC 音视频 SDK 有 2 种直播模式,分别如下:

1.RTC

RTC(Real Time Communication)实时音视频通信,最大的特点就是延迟极低,基本都是基于 WebRTC 标准,使用私有协议进行推流的。


主播


进入视频页面,打开自己的视频并加入房间。


//初始化 SDK 引擎


RtcManager.instance.initRtc(ctx)


//打开视频模块


RtcManager.instance.enableVideo()


//打开本地摄像头设置视图显示


RtcManager.instance.setupLocalVideo(VideoCanvas(textureView))


//加入房间


RtcManager.instance.joinChannel(rtcToken, roomId, userId, isHost)


加入房间成功之后,如果有人申请连麦并上麦后,会收到 onUserJoin 回调,只需要在合适的回调中显示移除上麦人的视图即可。


//在这显示上麦的人的视频


override fun onUserJoined(uid: String?, elapsed: Int) {


// add remote user


}


//移除他人视频


override fun onUserOffline(uid: String?, reason: Int) {


//remove remote user


}


游客


主播同意上麦申请后,应将自己的身份设置为?`CLIENT_ROLE_BROADCAS


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


TER`,并将自己的视频模块打开并添加到视图中。


//转换身份


RtcManager.instance.setClientRole(Constants.CLIENT_ROLE_BROADCASTER)


//添加自己的视频


val clientTexture = RtcEngine.CreateRendererView(this)


addVideoView(


binding.rlHostView,


clientTexture,


yourself = true,


setupLocalVideo = true


)


binding.apply.text = "下麦"


使用 RTC 模式实现非常的简单,只需要关注几个重要的回调即可。

2.RTMP+CDN

RTMP (Real Time Messaging Protocol)是基于 TCP 的流媒体传输协议,最大的特点是与 CDN 的强绑定,需要借助 CDN 的负载均衡系统将内容推送到接近用户的边缘节点,使用户就近取得所需内容,提高用户访问的响应速度和成功率,解决因分布、带宽、服务器性能带来的访问延迟问题。更多适用于站点加速、点播、短视频等场景。


使用该模式比 RTC 模式代码要写的多一点,因为主播短要设置上麦人的视频合流参数,观众需要添加一个 AnyRTC 内置的播放器用来拉 rtmp 流。


rtmp 会比 RTC 延时要高一些,但是连麦不会,因为连麦后还是走的 RTC 模式,因此,连麦的人和主播之间的延时会很小。其他观众拉流的话,并不会察觉到主播和上麦者之间有什么延迟。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
一键调用,Get Android 实现视频连麦直播的核心原理,kotlin常用高阶函数