视频连麦产品端核心步骤分析

  • 游客申请连麦/取消申请
  • 主播同意/拒绝申请
  • 音视频发布取消
  • 支持很多观众观看
  • 支持多人连麦
  • 低延时
  • IM 弹幕

视频连麦技术端调研

emmm,大致可以分为视频采集、编码,传输,解码,渲染%¥#@¥%…………%……¥……%¥%……¥%%……%#¥%#%¥&%&……%……&%……¥?卒

所以经过调研,发现市场上已经有很多成熟的商业解决方案,并且成本很低就可以接入使用。

对比了很久,最后采用 anyRTC 公司的两个 SDK 来完成视频连麦中的音视频通许和信令传输。

  • RTC 实时视频通讯
  • RTM 实时消息传输

信令交互

首先利用 RTM SDK,主播和游客端都分别加入同一个频道,这样就能实现频道内的成员心令交互。
实现申请连麦/取消申请连麦的话,只需要和主播端约定好信令格式即可,代码如下。

游客

//申请连麦
fun applyLine() {RtmManager.instance.sendPeerMessage(hostId,"{\"cmd\": \"apply\", \"avatar\": \"$userAvatar\", \"userName\": \"$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_BROADCASTER,并将自己的视频模块打开并添加到视图中。

//转换身份
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 模式,因此,连麦的人和主播之间的延时会很小。其他观众拉流的话,并不会察觉到主播和上麦者之间有什么延迟。

主播推流到 CDN

//加入频道成功
override fun joinChannelSuccess() {//设置合流参数publishPushLiveTranscoding()//添加推流地址RtcManager.instance.addPublishStreamUrl(cdnUrl, true)
}private fun publishPushLiveTranscoding(transcodingArr: List<LiveTranscoding.TranscodingUser>,canvasInfo: CDNStreamLayoutInfo) {rtcEngine?.setLiveTranscoding(LiveTranscoding().apply {width = canvasInfo.widthheight = canvasInfo.height}.apply { transcodingArr.forEach { addUser(it) } })}//游客上麦
override fun onUserJoin(uid: String) {//更新合流布局updatePushLiveTranscoding()
}  //游客下麦
override fun onUserOffline(uid: String) {//更新合流布局updatePushLiveTranscoding()
}

这里需要注意的是合流布局参数的设置,具体可以查看文末 github仓库代码。

游客拉流播放

//创建播放器并播放主播的流RtcManager.instance.initMediaPlayer().apply {open(cdnUrl, 0)setView(textureView)play()}

游客上下麦还是和上麦的流程一致,变的只是界面上的效果。具体可以参考Demo

效果图展示

Demo 代码地址

Android技术分享| 实现视频连麦直播相关推荐

  1. android微信分享之视频、URL地址、表情分享

    android微信分享之视频.URL地址.表情分享 1.视频分享 1.创建WXVideoObject对象,用于指向视频URL WXVideoObject videoObject = new WXVid ...

  2. mysql朗读,Android技术分享-文字转语音并朗读

    Android技术分享-文字转语音并朗读 最近在做一个项目,其中有一个功能是需要将文本转换成语音并播放出来.下面我将我的做法分享一下. 非常令人开心的是,Android系统目前已经集成了TTS,提供了 ...

  3. 我的CSDN直播首秀来了:技术分享成就精彩程序人生(直播间还送福利哦)

    2020博客之星评选活动刚刚落下帷幕,博客之星亚军获得者有感而发:技术分享之路让他收获良多,从一名没有互联网经验,未曾接触过分布式服务.大数据.高并发逆袭成为中通科技资深架构师,负责消息中间件.全链路 ...

  4. iOS直播技术分享-音视频采集(一)

    1.iOS直播技术的流程 直播技术的流程大致可以分为几个步骤:数据采集.图像处理(实时滤镜).视频编码.封包.上传.云端(转码.录制.分发).直播播放器. 数据采集:通过摄像头和麦克风获得实时的音视频 ...

  5. Android技术分享| ViewPager2离屏加载,实现抖音上下视频滑动

    要实现类似抖音上下滑动小视频的丝滑效果,需要有一个预加载的功能.所谓的预加载, 就是需要在显示当前页的情况下,提前将当前页后面的内容加载,以保证用户滑动到下一个视频的时候, 可以减少等待时间,在正常网 ...

  6. 能认真做 Android 技术分享的已经不多了

    如题,目前的 Android 大环境大家都清楚,再加上知识付费的不同形式体现,最终导致 高质量 的东西越来越少,想要安静地学点东西已经很难了. 今天这个你认为是广告也罢,认为我是认真推荐的也没问题. ...

  7. 技术分享| 音视频与微信小程序互通实践

    随着网络架构的变迁.媒体技术发展.音视频场景迭代,基于流媒体的技术也是推陈出新.WebRTC渐渐的成为了音视频互动场景的主流,而微信在6.5.21版本通过小程序开放了实时音视频能力,开发者们可以使用组 ...

  8. 技术分享| 探索视频感知编码

    一.什么是视频编码 视频编码就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式.视频流传输中最为重要的编解码标准有国际电联的H.261.H.263.H.264.H265,Googl ...

  9. Android技术分享

    Android入门实践 什么是Android Android是基于Linux内核开发.主要以Java为开发语言的一个开源的操作系统,主要用于移动设备,如智能手机和平板电脑.可穿戴设备等,当然还有更多的 ...

  10. Android技术分享| 【Android 自定义View】多人视频通话控件

    [Android 自定义View]多人视频通话控件 *以上图片截自微信等待中界面 等待中界面 上图是微信多人视频通话时未接通的界面状态,可见每个人的 View 中大致需包含了以下元素. 头像 昵称 L ...

最新文章

  1. 使用command对象操作数据库
  2. dot3_bump_mapping
  3. shell中if [ -e/d/f ..... ]的解释
  4. 【方法杂谈】你真的了解CVPR吗?
  5. python 运算符 (算术运算符、比较(关系)运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符、运算符优先级)(与或非)(异或)
  6. mysql命令行的一些小技巧
  7. Android dex分包方案 (多dex)
  8. POJ3009-Curling 2.0
  9. 巧用云计算 突围移动APP行业乱象
  10. pytorch贝叶斯网络_贝叶斯神经网络:2个在TensorFlow和Pytorch中完全连接
  11. ADODB.Stream 错误 '800a0bbc' 写入文件失败
  12. excel 单元格名称 java_Java 创建、编辑、删除Excel命名区域
  13. dedecms 模型新添加的自定义字段设置样式
  14. linux学习(7)第七章、Linux 文件与目录管理
  15. OC6_代理的基本概念
  16. unity-3d:打飞碟游戏
  17. 各家关节机器人示教器特点
  18. 赛式方法论(上):为什么你的游戏做不完、做得烂?
  19. Cisco 2960交换机密码恢复
  20. 寻找平面上的极大点(信息学奥赛一本通-T1230)

热门文章

  1. 六款最佳、免费的网络延迟测试工具
  2. 树梅派应用38:树莓派 SAKS 扩展板挑战应用 之 PM2.5 指示灯
  3. 如何用控制台cmd打开你的c++程序
  4. Android之实现手写电子签名
  5. 润乾报表设计器——预览报表问题解决
  6. 将实时频谱分析仪与HIF输出配合使用
  7. NYOJ 小明的调查作业
  8. mysql phpmyadmin 报403错误_phpmyadmin出现403错误怎么办?
  9. 坐标旋转变换 公式图解
  10. JAVA高级视频_IO输入与输出_第一部分(System、Runtime、Date、Calendar、MathRandom、IO输入输出与概述、文件的续写、FileReader、复制文件、)...