背景
我司的产品应用场景中,有多人在线会议,并将会议实况同步推流到第三方直播平台这样的需求。在做了大量的调研之后,发现市面上的在线会议工具基本不具备类似特性,很多时候需要借助 OBS 等直播推流工具录屏并推流。与此同时,有些客户需要同步推流到多个第三方平台。此前我们在组织此类直播时,往往需要独立的运营同学配合操作 OBS,带来一定的操作难度、网络稳定性以及嘉宾用户体验等问题。
我们在排除市面各种直播和会议工具之后,决定采用 WebRTC 的方案,完成多人在线会议及实况多端推流。在调研声网、阿某云及某讯云的实时音视频通信服务后,从客户支持、入门价格以及文档完整性上,最终我们选择了声网。在这里也特别感谢声网的技术同学,伴随着最初的产品开发测试直至现在稳定运维,他们在微信群里帮助我们解决了无数的小问题,不断纠正我们对于技术文档理解的偏差。
声网的 API 功能非常强大,支持 PC 桌面、手机、web 端,由于我们项目的特殊需求,我们仅采用了 Agora WebRTC 方案,本篇文章也仅仅对我们使用声网 CDN 旁路推流部分的经验进行总结,希望能给大家带来一些启发。
录制 API
在推流的场景中,除了 CDN 推流 API 外,我们也一并调研了相近的音视频录制功能,这些功能也曾经进入我们的考虑范围,这里一并总结,方便各位看官比较理解。
客户端录制:提供了类似电话通话录音录像功能,自动将录制文件存储在客户端本地。可能是受限于浏览器,此项功能仅对 Native SDK 有效,WebSDK 并没有相关 API 提供。
云端录制:与客户端录制不同,客户端通过 restful API 完成相关录制设置,声网的云端服务器自动录制并存储。比较好玩的地方是,云端录制可以直接对接第三方的云存储服务,比如七牛云、阿里云 OSS、亚马逊 S3、腾讯云、金山云等主流公有云等对象存储。最新的文档中还提到可以支持阿里云的视频点播服务,对于视频点播架设在阿里云上的朋友来说算是一个小小福利吧。
本地服务器端录制:顾名思义,在我们自己的服务器中完成音视频的录制和存储,目前仅支持 Linux 的 Java/C++编程,可以把音视频流存储到指定的文件夹下,我们曾经也调研过是不是可以通过 FFMPEG 转推到第三方平台,从 API 接口上看,似乎并不支持这么操作。
Agora CDN 推流介绍
注意,CDN 旁路推流功能需要找客服或者自助开启。
CDN 旁路推流主要角色和组件如上图所示,一个或者多个主播在线,每位主播都会有各自的音视频在频道内分享,此时任一主播均可以发起 CDN 推流请求。
1) SD-RTN 接收到 CDN 推流请求,该请求包括第三方 CDN 地址,推流布局等参数;
2) SD-RTN 完成视频的转码合成,如果是单一主播,可以不用经过转码或者设置推流布局;(转码需要额外的费用,而且不包括在声网每个月赠送的 10000 分钟时长)
3) 并通过 RTMP/RTMPS 协议将转码之后的数据流推送至指定的外部 CDN;
4) 听众从 CDN 拉流完成直播;
我们产品的应用场景,大多数情况下,都是多位主播同时在线,需要往多个第三方 CDN 推流,必然会用到转码,在这里我们重点描述一下 CDN 推流 API。
需要注意的有几个点:
1) 每增加一个 CDN 推流,声网服务器会增加一个新用户登录到频道中,并订阅声明布局中的所有用户的音频+视频流,会导致额外的订阅时间;
2) 每增加一个 CDN 推流,会导致多一倍的视频转码费用(如果开启转码了的话,多主播基本都会开启转码功能);
3) 如果调用 startLiveStreaming 方法的 client 因为各种原因离开了频道,由该 client 发起的 CDN 推流都会自动停止;这里也是我们团队纠结了很久的地方,究竟应该由哪位用户发起推流;web 端任何一个主播都有可能因为各种原因出现网络中断导致离开频道,终端用户的体验会比较差;所以尽可能在业务设计中,让最不容易掉线的主播来开启直播推流,在我们的场景中,我们设定为会议直播的发起者;
4) 如果第三方 CDN 出现各种问题,声网的 CDN 推流 SDK 会自动发起重试,这一过程对于客户端编程是透明的,当然,我们也可以订阅相关事件,监控推流成功、失败、重试等状态,给用户最真实的状态呈现;
CDN 推流转码中最重要的是转码参数设置,其数据结构描述很简单,但是功能很强大,可以很容实现简单的云导播台功能,代码样例如下:
大部分的字段从字面上可以了解其具体含义,我针对其中特定字段进行一下说明,加入我们关于这部分设计的考虑:
1) width/height,最终输出的画布大小,我们当初在画布大小选择上花费了一定时间,主要是从成本上考虑,转码的费用与画布大小有密切关系,超过 1280 * 720 后,转码费用会变成原先的 4 倍,因此在效果允许的情况下,通常设置为 1280 * 720 及以下;当然这里会涉及到原始视频到画布的映射关系,如下面代码所示:
2)Images 字段可以设置直播画布的水印,或者加入简单的背景;
3)transcodeUsers 字段描述了频道中每一位主播以及对应的视频画面大小和坐标,如果不希望该用户的视频信息推流,可以把 width/height 设置为 0;如果需要把指定的视频流输出到画布中,上述代码按照原始视频等比例调整放到画布里,当然有的需求是对原始视频进行截取,都可以通过上述代码来完成;
4)GOP / videoBitRate / videoFrameRate,视频帧设定,会影响最终推流视频数据大小,有些推流 CDN 是按照流量来计算费用,针对屏幕分享、摄像头分享,对应视频帧设定会很不一样,流量会有几倍的差距。通常屏幕分享,videoFrameRate 我们控制在 5,GOP 可以控制在 40 – 100,如果是摄像头分享,为了让人物动作连贯,通常 videoFrameRate 设定在 20 及以上,大家可以针对自己的场景进行测试调整,以找到最佳的参数设置;
最后一点我特别喜欢声网 CDN 旁路推流的原因:
client.setLiveTranscoding(LiveTranscoding);
该 API 可以在推流开始以后动态调用,实时完成推流布局的变更,从而实现一个简单的云导播台功能,这个功能基本可以匹配 OBS 的简单推流布局,极大增强了用户体验。
总结
声网的 CDN 推流服务,非常契合我们产品的应用场景,特别是结合第三方 CDN 服务,可以很容易做到大规模直播、视频录制、直播转点播、回放生成等功能集合,让 90%依赖 OBS 等推流软件的场景消失,可以完全解放会议运营同学的工作时间。
声网 API 的便利性,演示代码和文档的完整性,也大大降低了我们使用声网高阶功能的难度,按照我们产品路线图,互动直播,自动美颜,直播自动化等功能也都在规划中。
此外,从产品研发、测试到上线运营,声网技术客服同学微信群全程陪伴,也总能得到非常及时的响应,让我们受宠若惊,我们期待解锁更多声网的互动功能,并逐步加入到我们的产品中。
评论