欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

腾讯云直播一直播连麦实践

程序员文章站 2022-06-10 14:17:31
...

直播连麦

连麦(也叫上麦)是比较热门的直播功能。所谓连麦,是指一个直播间中可以不仅只有一个主播,观众(或其它房间的主播)也可以参与进来与主播进行视频互动,从而增加视频直播的趣味性。

单向”到“多向

腾讯云直播一直播连麦实践
既然要做连麦,那么反向的一条线路就必不可少,我们这里做个假设,观众 A 从原来的普通观众变成了小主播,那么下图中就多出了一条直播流(图中红色虚线所示):
腾讯云直播一直播连麦实践
注意:
腾讯云 RTMP 直播支持跨房间连麦互动,所以小主播(们)可以是原房间里的普通观众,也可以是另一直播间里的其他主播。

从“单向”到“多向”,这看似很简单,而且直接用 RTMP SDK 按这个思路也是可以实现的。但效果却很难达到商用的要求,因为有三个难题需要我们去解决:

延迟问题
常规直播解决方案中从推流端到播放端的延迟一般在2秒 - 3秒,但是连麦场景中大主播和小主播们之间的延迟如果超过1s,和谐的语音沟通就基本不可能了。
回音问题
常规直播解决方案中,由于语音是单向的(主播说 => 观众听),所以没有必要去做 AEC(回音消除)。但是连麦场景中有双向(或多向)的语音沟通,主播的声音流向小主播那一端的扬声器,如果不做回音消除,这些声音会再经由麦克风采集后返还给主播本人。
混流问题
解决完延迟问题和回音问题,大主播和小主播(们)之间就可以进行互动,但是要让普通的直播观众看到才算真正成功,所以多路画面必须要完成混流才能在观众端正常展示。

降低延迟
我们先看看怎么解决延迟问题,要解决延迟,先要弄明白延迟是怎么来的?
腾讯云直播一直播连麦实践
上图中红色标记的三处是整条链路的主要延迟来源,一场延迟大约3秒的直播中,以上三个模块“贡献”了80%的力量。

转码模块

延迟的原因:
转码模块的主要工作是对主播推上来的音视频数据做进一步的加工处理,同时,如果您有多清晰度(超清、高清、标清)以及多格式(例如适合 Web 播放的 HLS)的需求,也需要转码模块进行处理。
应对的思路:
在连麦场景中,大主播和小主播(们)之间如果都使用 RTMP 协议构建链路,则不需要转码集群的参与,这样可以省掉这部分延迟。

CDN 集群

延迟的原因:
CDN 集群存在目的是分发数据流:如果主播在上海,那么他/她肯定是向上海的服务器推流,这样才能保证较好的上传质量,问题来了,桂林和哈尔滨的观众怎么办呢?难道从上海的服务器上去拉流吗?显然这并不是一个好主意,可行的方案是通过 CDN 分发集群将音视频流按需分发到桂林和哈尔滨两个城市。
应对的思路:
连麦场景中,大主播和小主播(们)之间如果都不走 CDN 集群,他们之间的延迟可以缩短很大一截。但这样一来,地域问题如何解决? 例如有两位主播要连麦互动,一位在北京,一位在深圳,相隔千里,如何才能构建低延时且高质量的直播链路呢?
腾讯云的解决方案是采用 RtmpAcc 加速节点,它是我们专门为连麦场景所设立的超低延迟加速集群,在全国各大关键网络节点均有部署。这些加速节点全部由专线连接,唯一的职能便是为处于不同地域、不同运营商的主播,提供可靠而优质的低延时链路。
腾讯云直播一直播连麦实践

播放器缓冲

延迟的原因:
播放器的缓冲是多多少少都要有的,因为下行网络不可能均匀平滑不抖动。缓冲区越长,抗网络抖动的效果就越好,视频的观看体验也就越流畅,同时,这也意味着更大的延迟。常规解决方案中,我们一般设置500ms或者1000ms以上的播放器缓冲。
应对的思路:
在连麦场景中,这里就要激进一些,例如200ms的延迟相对适中。于此同时,常规开源解决方案的播放器一般不具备延迟修正能力,所以随着卡顿次数的增加,延迟也越积越多。在连麦场景下,延迟是不能容忍的,所以延迟修正不仅不可或缺,而且策略也要非常激进。

消除回音(AEC)
如果要做双向的语音通讯,回音消除是不可或缺的,我们从 RTMP SDK 1.8.2 开始,在 iOS 和 Android 两个平台引入了回音消除模块,从而避免主播在手机的喇叭里听到1秒前自己说话的声音。
腾讯云直播一直播连麦实践
从上图可以看出,AEC 模块是躲在 RTMP SDK 里面的,所以在使用上您不需要额外的编程。

多路混流

腾讯云有两种技术可以实现混流:客户端混流和服务端混流。

客户端混流
源自 RTMP SDK 1.8.2 开始支持的多实例播放,也就是可以并行的播放多个直播 URL, 视频 View 也可以相互叠加。这样一来,只要观众端能拿到多个主播的 URL 就可以实现客户端混流。
服务端混流
服务端混流是近期推出的一项新解决方案,目前外网已经可以支持。它是腾讯云视频转码集群的一个附加模块,可以将多路视频流直接在云端混成一路,减少下行的带宽压力。
腾讯云直播一直播连麦实践

使用方法

以iOS + Android为例

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

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

功能体验

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

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

代码对接

Step1. 下载 LiteAVSDK 和 MLVBLiveRoom 组件
移动直播提供的连麦能力需要依赖三个组件:

  1. LiteAVSDK:闭源,负责直播推流,直播拉流,以及连麦视频通话功能。
  2. TIMSDK:闭源,负责构建直播聊天室,以及聊天室中用户之间的消息传输功能。
  3. MLVBLiveRoom:开源,基于 LiteAVSDK 和 TIMSDK 搭建一个支持连麦互动和消息互动的“直播间”。
    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 函数需要指定相关参数:
腾讯云直播一直播连麦实践
腾讯云直播一直播连麦实践
腾讯云直播一直播连麦实践
腾讯云直播一直播连麦实践
腾讯云直播一直播连麦实践
腾讯云直播一直播连麦实践
参考文章:
https://cloud.tencent.com/document/product/267/8108
https://cloud.tencent.com/document/product/454/14606