如何从 0 到 1 开发一款完整的直播 App

zscw4586 8年前
   <p><strong>编者按:</strong> 随着移动互联网的发展,越来越多的人选择用手机来看直播。一款直播 App,需花费多少力气解决技术问题?市面上有哪些成熟的方案可以直接借鉴?如何把这些方案结合在一起并解决问题?9 月3 日,在七牛云举办的架构师实践日上,七牛直播云工程师陶泽宇,对怎样完美解决视频企业的三高之痛带来了全新视角。以下是对他演讲内容的整理。</p>    <h3><strong>开发一个直播 App 包含哪些部分</strong> </h3>    <p>iOS / Android  客户端</p>    <p>Web  端播放器</p>    <p>业务服务器</p>    <p>分发网络</p>    <h3><strong>七牛直播云针对 iOS / Android  客户端做了怎样的优化</strong></h3>    <p>iOS / Android 客户端包含采集、音视频处理、编码和连麦功能。</p>    <p>采集:通过手机的麦克风和摄象头把音视频采集到一起。必须为 Android 和 iOS 各做一套采集方案。</p>    <p>音视频处理:采集后的音视频不能直接推流,必须对采集的音视频数据进行处理。比如,视频数据每秒钟要处理 25 到 30 帧的图片,这对 CPU 的消耗非常大。此外,视频处理方面,主播美颜是一个刚需,此外还必须给视频打上水印。音频方面也有很多东西是可做的,比方说音效,如混响效果可以让主播的声音听起来更有磁性。此外如果想要让主播可以表演唱歌,则需要讲伴奏的音频文件和主播的声音进行混音。为了更好的体验,返听功能也可以做。</p>    <p>编码:在直播推流进行编码时,尽量采用硬编,这可以减少 CPU 占用率,间接可以减少手机的发热量和耗电量。为了保证在所有设备上我们都可以进行编码,还需要准备一个软编方案,当某种机型上无法使用硬编,则立即还成软编。</p>    <p>连麦:作为观众给主播反馈的重要形式,可以极大丰富观众直播体验。比如,主播在表演节目时,观众想和主播对话,主播就会弹出一个邀请,要求连麦观众的画面就会出现在主播屏幕右下角的小窗上,所有的观众都可以看到这个场景。传统的直播采取的是主播一对多的推流的方式,而连麦可以做到多对多推流,这个功能非常受欢迎。连麦可以做出很多丰富的形式,例如主播与主播进行 PK,观众把屏幕横过来后,可以看到屏幕左边是一个主播的图象,右边是另外一个主播的图象 。</p>    <h3>分发网络</h3>    <p>对于分发网络结构的选择,常见的是树状的分发网络,比如 CDN 就是一种树状分发网络。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a5eed0b2eb41bb7b6458a5d2b2f995c6.png"></p>    <p style="text-align: center;">图 1</p>    <p>以图 1为例,演示 CDN 。图中每个白色节点对应某一个地方的机房。这种结构中,节点之间的等级有层次之分。</p>    <p>推流通常是由中央向边缘节点推,比如从左侧开始推流到中心节点,然后再经过中心节点分发到全国各地的边缘节点,观众就能够观看直播。 </p>    <p>这种传统的 CDN 树型分发网络比较常见,但是不一定适应现在这种主播数目越来越多的趋势。</p>    <p>与十年前相比,只有电视媒体可以做直播。直播的参与者也都是专业的主持人。但是,现在人们只需要一台手机就可以做直播了。换句话说,直播这个事,参与的门槛越来越低是一个趋势。</p>    <p>这种趋势带来的影响有两个:</p>    <p>1. 主播的数量越来越多,造成推流节点里的人会越来越多;</p>    <p>2. 对于某个主播的观众而言,不再局限于某一个区域,而是分布在全国各地。</p>    <p>这样一来,树状分发网络的中心节点将成为整个网络的瓶颈。因为大量的主播的推流几乎不可避免地经过中心节点,而中心节点一旦故障则会影响全局。</p>    <p>为了解决这个问题,可以选择网状的分发网络来代替树状的分发网络。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/aa9dd030a5f82f81435053ca04062f6f.png"> <img src="https://simg.open-open.com/show/d3417c75f3958c9ce25f299335c9871f.png" alt="如何从 0 到 1 开发一款完整的直播 App" width="550" height="408"></p>    <p style="text-align: center;">图 2</p>    <p>以图 2 为例,演示分发网络,与树状网络一个最大的区别是节点对等。直播线路是靠节点之间的地理关系、资源负载、网络质量形成调度依据绘制最优线路。相对于 CDN 树状网络,一个很明显的特性是分发网络没有中心节点,做到了去中心化,以此规避因中心节点网络波动导致片区故障。这种网络更加适合做直播,七牛云的实时流分发网络采用的也是这种网状结构。</p>    <p>开发一款完整的直播 App 在客户端涉及到一些技术问题以及分发网络要解决,但采用七牛的直播云 SDK 和 LiveNet 将会省去很多麻烦。因为七牛的直播云 SDK ,针对的就是 Android 和 IOS 移动客户端,而 LiveNet  相对于传统的 CDN 采取的是智能调度与分发。</p>    <p>此外,七牛直播云 SDK 可以从 LiveNet 获取离设备最近的几个边缘节点的网络状态,从而挑选一个最好的节点来进行推流和播放。这类似于出门之前在手机上看看城市交通状况,选一条最不拥堵的路出行。这不但可以保持本设备拥有优质的网络资源,同时对于整个网络的各个节点均摊负载也是有利的。</p>    <p>但是,有了这些功能还远远不够。</p>    <p>直播是一种转瞬即逝的东西,播完了就没了,这种东西如何做运营呢?这其实就涉及如何把直播内容存储起来的问题。对此,七牛云可以提供云存储服务,它可以方便地把直播的内容存储下来,以供点播和回放。</p>    <p>此外将直播内容抽帧成一组图片,然后利用七牛数据处理平台的图片鉴黄鉴暴恐服务,就可以对直播进行鉴黄和鉴暴恐。</p>    <h3><strong>总结 </strong></h3>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/5b986a302658dd4105e9c8ea6b9fa380.png"></p>    <p style="text-align: center;">图 3</p>    <p>以图  3 为例,演示七直播云 SDK 和 LiveNet 的关系。左边的部分代表七牛直播云 SDK ,右边深绿色的部分代表 LiveNet 网络,橙色部分是我们自己的业务服务器,它可以通过七牛的 Server 端 SDK 与 LiveNet 进行通讯。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/546a1e2ee9a2dcdc27b7ea3eaaba65c8.png"> <img src="https://simg.open-open.com/show/aedf0dbb46a2d59ec89788787ff28aa4.png" alt="如何从 0 到 1 开发一款完整的直播 App" width="550" height="236"></p>    <p style="text-align: center;">图 4</p>    <p>以图  4 为例,演示七牛直播云 SDK 播放端如何从 LiveNet 把直播流播放出来。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/ee0abebeadaccd35d72b80829894c84c.png"></p>    <p style="text-align: center;">图 5</p>    <p>以图  5 为例,演示七牛云存储,如何与七牛直播云 SDK 结合,从而实现点播、回放功能。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/eb3f945646a038cd24560e47b7ef9501.png"></p>    <p style="text-align: center;">图 6</p>    <p>以图6 为例,演示七牛处理的服务。</p>    <p>开发一款完整的直播App,七牛的很多产品都可以直接使用,并且直接使用七牛产品付出的代价是最小的。</p>    <p> </p>    <p>来自:http://blog.qiniu.com/archives/7006</p>    <p> </p>