么么直播的音视频技术实践和优化
黄铭新,么么直播前端团队负责人2018年3月31日,“ZEGO Meetup 视频直播+的技术实践之道”第三期在上海成功举办,现场吸引了满堂的直播行业从业者到场聆听。会上,如预期一样,么么直播前端团队负责人黄铭新、即构科技资深技术专家和架构师冼牛、沪江CCTalk 音视频架构师武海滨和涂图TuSDK 研发技术总监王胜,这4位直播行业大咖给大家做了精彩分享。其中,么么直播前端团队负责人黄铭新老师主要给我们分享了么么直播这4年来,在移动端和Web端两大平台上踩过的坑以及优化经验。本文是对他演讲内容的整理。
嘉宾简介:曾就职于天天动听、英语流利说,现在么么直播负责前端开发团队的team leader相关工作。技术上主要偏向于JS、Node全栈式开发,主要负责公司内的主站、内部服务和部分微服务的开发和管理。
-------------------------------------------正文-------------------------------------------------------------
么么直播团队是在2012年底进入直播行业的,那时直播还处于混沌期,不像现在有这么多第三方直播技术解决方案商。么么直播平台一切从零开始,和很多C端厂商一起,一点点地研究一步步地推演直播技术,走了很多弯路。
近两年直播火爆后,涌现出了非常多的第三方直播解决方案。有些厂商专注于做类似云端的解决方案,提供一些比较好的服务器和算法,来提高流传输的速度;还有一些是只做客户端的SDK,帮助企业更快速地接入到直播业务中去;还有像即构科技这样的厂商,把两部分结合在一起,推出一整套解决方案,让想立即接入视频直播这个行业的公司和项目可以迅速启动。
会上,黄铭新重点与我们分享了么么直播在移动端和Web端推拉流研发中踩过的坑和优化经验。
么么直播前端技术负责人 黄铭新移动端平台的实践与优化
移动端推流step1
早期安卓手机整体性能偏弱,么么直播在移动端采用的是硬件编码+rtmp dump的推流方式。
硬件编码启用了GPU,解放了部分CPU的计算能力,能够支持业务上的计算,同时还降低了整个手机的发热量,间接延长了整个APP的使用时长,当时效果不错。但随着深入使用和测试,么么直播和其他竞品比较还存在以下问题:
1)画面比较模糊。
2)码率偏大。
为了解决这一问题也进行了很多尝试,但效果不甚理想,后来发现在Android内部,Google强制使用baseline的编码方式,调整效果不好。
3) 硬件的兼容性差。
Android上的MediaCodec编码器在不同手机和芯片平台上的表现略有差异,各个硬件厂商对它的支持也不尽相同,导致兼容非常费时费力,而iOS就相对没有这样的问题。
4) 网络推流不稳定。
针对直播端推流经常断和观众端出现卡顿等问题,么么直播也做了一些优化。例如,当推流网络堵塞时,会把还未发送的队列内数据进行丢弃,以保证整体的延迟不会太大,同时也对播放器的缓存大小进行调整,以减小网络不稳定造成的影响。
当时么么直播没有专门从事音视频研究的研发人员,做的以上努力使得性能效率有所提升,但和其他竞品相比还是存在差距。
在那段时间,直播行业开始爆发性增长,慢慢涌现了一批第三方解决方案,么么直播决定去尝试一些第三方的方案,希望能够解决一些痛点。
移动端推流step2
在找寻第三方解决方案的过程中,么么直播团队发现第三方提供商的一个共通点是——他们大部分采用软件编码+硬件编码的解决思路。么么直播内部也开始按照这样的思路进行尝试,尝试了一段时间后,整体性能有所提升,同时也发现了两个问题:
1)低端机器的整体性能偏弱,导致视频下载帧率不太稳定,没有办法稳定在20、30帧,有时候直接跳到100或个位数;
2) 采用了软件编码后,低端机器的发热量大。
“我们尝试了软件编码+硬件编码的这个解决方案,但发现这个方案也不成熟,然后我们遇到了即构科技的方案。我们在直播行业的前一到两年里摸爬滚打了很久,也尝试了很多方案,可是毕竟没有专门的音视频人员去深入地研究音视频技术的性能问题,市面上一般的解决方案也常是东补一块墙、西补一块墙,很难全面的解决问题。在接触到即构科技后,我们发现即构可以完善地解决之前碰到的问题,无论是在画质、兼容性、卡顿频率,还是在加载速度、视频的稳定程度上,直播的性能都得到了非常大的提升,的确做到了业界领先的水平。”么么直播前端技术负责人黄铭新如是说。
移动端拉流
移动端的拉流相对简单。么么直播早期使用的是Ijkplayer进行视频流的播放,基本稳定,不需折腾,使用起来也正常。但随着各家直播平台性能的提升,么么直播的首屏加载时间相比较长,体验差。在同样接入几个机型对比后发现,么么直播发现在拉相同流的情况下,即构的播放器加载速度更快一些。所以最后,无论是推流还是拉流,么么直播平台都替换成了即构的解决方案。
美颜
现在,美颜是直播平台必备的功能。么么直播最早在开发美颜功能时,并没有那么顺利。起初即构的SDK并没有把视频流的原始数据开放出来,而美颜的SDK需要使用视频流原始数据,然后进行再加工,所以最初碰到了整合的问题。通过沟通,即构决定开放他们的视频流原始数据,提供内存和textureID两种形式暴露数据,而市面上大部分的美颜相关的SDK都支持这两种方式,所以美颜问题也得到了顺利解决。
Web端平台的实践与优化
Web端推流
web上主要有两种推流方式,直接使用flash开播或者使用OBS软件开播。么么直播没有对OBS进行二次开发,所以在有限带宽内,会给主播提供几个码率、分辨率的配置,依据不同的网络环境自行进行调整,可是主播相对来说不愿使用。
黄铭新表示,很多平台已经不太使用flash这种开播方式,但flash的推流方案在么么直播平台是很多主播的选择。么么直播平台的主要业务集中在美女直播,相对斗鱼和其他游戏平台所需带宽的量小一些。这种情况下,flash有先天优势。它最主要的优点是方便,主播不需要进行额外的学习,直接上手,浏览器支持flash打开页面就能用。不过这也带来了另外的几个问题:
1)flash自身的缺陷——对系统资源的消耗较大
2)flash不支持AAC编码,只有Nelly Moser 和Speex 两种音频编码格式,所以在同等的音视频质量下,推流所需的带宽较高。
针对这些问题,么么直播做了如下一些尝试:
1、开发桌面端插件。简单地说,就是开发一个第三方插件,主播开播的时候不走flash的推流流程,而是直接通过插件进行推流。这在一定程度上能解决上面的问题,但是不同PC的兼容性问题、开发成本以及主播的主观能动性都使这一方案没有继续使用。
2、开发单独的推流软件。这点很多平台都有在做。独立的推流软件稳定性高、性能好,并且可定制化程度也比较好,但是需要的研发资源和人力比较高,受制于当时团队内部没有这么多的人力开发,最终否掉了这个方案。
3、服务端转码。在服务端对现有的流进行转码,这个其实已经应用得比较广泛了。最常见的就是将一路高清或者大码率的流进行转码,然后拆分出几路低清的流,上来的是非AAC的流,通过转码最终下行拉流的时候拉取的是AAC流。目前我们也是使用服务端转码的解决方案。
Web端拉流
H5上使用的是hls进行拉流,通过转码就能够做到。由于hls的特性,需要切片,所以延迟相对高。
pc端主要是使用rtmp和flv两种流格式,么么直播平台rtmp使用flash进行播放,flv使用js进行播放。
使用flash播放rtmp的流时,涉及到视频的秒开时间、flash加载速度两大性能指标。么么直播首先通过精简播放器的体积,使其从原来的600多K减小到现在的19K;然后在前端页面上采取分块加载的策略,优先加载和播放相关的代码或者文件。进行了这两方面的处理后,视频的秒开时间从原先的3-4秒降到了2秒内。
flv使用的是纯前端js播放,通过使用最新的Media Source ExtensionsAPI,可以把flv的视频流通过前端转码,直接在页面上通过video标签进行播放,使其无需flash。
rtmp跟flv流的性能相当,由于flv舍弃了flash,整体CPU消耗比原先降低了5%—10%左右,所以使用flv整体性能提升是较大的。并且,相对小的性能消耗可以得到和flash一样的直播播放体验。
关于即构ZEGO
即构科技于2015年由QQ前总经理林友尧创立,A轮获得IDG投资,核心团队来自腾讯QQ,汇聚了来自YY和华为等厂商的顶尖语音视频人才。即构ZEGO致力于提供全球最清晰最稳定的实时语音视频云服务,助力企业业务创新,改变用户线上沟通方式。即构ZEGO深耕视频直播、视频社交、游戏语音、线上抓娃娃和在线教育等领域,赢得了映客、花椒直播、一直播、喜马拉雅FM、陌陌游戏、自由之战2、和好未来等顶级厂商托付和信赖。