开始之前说几句:这两年视音频技术大火,基本上每个公司都或多或少的涉及到了一些视音频的开发工作。之前因为公司项目的原因,我也写过一个android端的视频播放器,但是自我感觉还是对音视频技术一知半解,比如一些视音频的概念,封装格式,流媒体传输协议等,再深入一些的视音频的编解码,流媒体的传输这些技术点。所以下定决心要好好研究一下视音频的相关技术。
这篇笔记是从搭建一个完整的直播流架构中开始,讲解一下一个直播流的架构每个方面涉及到的视音频技术点及其概念。
上图这是一个直播流的架构图,从图中可以看到一个完整直播的流程,共有8个步骤。 下面依次讲一下每个过程的作用和涉及到的视音频技术!
采集
采集指的时候采集要直播的音视频原始数据,如果是要做摄像头直播,那就得用摄像头采集(前置/后置) ,如果是要做录屏直播,那就得采集屏幕。音频直播的话,就得采集音频。
重点:这里采集到的视音频数据是原始数据, 其中音频的PCM编码的原始数据, 视频是YUV 编码的原始数据。 这些原始数据是十分巨大的。所以这些原始数据要进行网络传输,需要先进行编码处理。
原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB
处理
视频或者音频完成采集之后得到原始数据,为了增强一些现场效果或者加上一些额外的效果,我们一般会在将其编码压缩前进行处理,比如打上时间戳或者公司 Logo 的水印,祛斑美颜和声音混淆等处理.
编码
在采集的时候说过,音频采集的是PCM编码的原始数据, 视频采集的是YUV 编码的原始数据。而原始数据都十分巨大。所以需要进行编码压缩。 所谓的编码说白了就是进行一些数据算法的压缩。 视频编码目前来说主要的是 H.265 和 VP9 这两种编码方式。 音频的压缩编码标准包含AAC,MP3,AC-3等等。
编码的意义以视频编码为例:
原始视频数据存储空间大,一个 1080P 的 7 s 视频需要 817 MB
原始视频数据传输占用带宽大,10 Mbps 的带宽传输上述 7 s 视频需要 11 分钟
而经过 H.264 编码压缩之后,视频大小只有 708 k ,10 Mbps 的带宽仅仅需要 500 ms ,可以满足实时传输的需求,所以从视频采集传感器采集来的原始视频势必要经过视频编码。
封装格式:
这个封装格式指的是视频的封装格式,常见的封装格式有DivX/Xvid,FLV,TS/TP,MKV,MOV,M4V,AVI,MP4,3GP这些。 其实封装格式也是我们常说的视频的格式。 封装格式的意义是: 视频码流和音频码流按照一定的 规则存储在一个文件中。 没看懂(* | *),没关系我说的直白点,我们采集到了视频流,也采集到了音频流。 因为采集源和编码的方式不同,在采集和编码阶段这两个肯定是要单独做的,但是你播的时候不能单独播吧。 你是得和在一起。 封装格式,就是把音频流和视频流安装规则组合在一起的意思。
推流,服务端分发 ,拉流
推流是指我们用摄像头或者录屏的采集的数据,经过封装后,我们需要把它的发送到服务器。 而观看直播的用户通过客户端获取我们发送的服务端的流媒体数据流。 从而达到直播的效果。
而推流,拉流过程肯定有数据传输,就像我们用http获取数据时,用的是tcp协议一样。流媒体的传输也是有自己对应的协议的。 也就是所谓的流媒体传输协议。常见的流媒体协议有:MMS,RTSP (RTP, SDP), RTMP,HTTP progressive streaming,HLS - HTTP live streaming (M3U8)等。 而每种流媒体协议都有自己的特性。 这里就不摊开讲了(我也不是很懂),自己看参考的链接吧。
常用的流媒体协议:
http://zzqhost.github.io/hostwiki/%E5%A4%9A%E5%AA%92%E4%BD%93%E7%9B%B8%E5%85%B3_%E6%B5%81%E5%AA%92%E4%BD%93%E4%B8%AD%E7%94%A8%E5%88%B0%E7%9A%84%E5%87%A0%E4%B8%AA%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B.html
现在市场上直播推送协议主要有这3种 RTMP,WebRTC,基于 UDP 的私有协议 。啥,你问我为什么其他流媒体协议不是主流。 (@ | @)我都说了。各有特性嘛!!
常用的几种直播流协议对比http://www.jianshu.com/p/a0c3d3f4e430
流媒体服务器:
对了还有服务器, 直播的用户在客户端把封装好的流媒体,发到服务端。 观看直播的用户从服务端拉取数据。那你说了。那服务器我们用tomcat行不行。 天真脸。 你还振振有词呢,说我平时把一个mp4啥的放到的tomcat服务器上,用播放器直接就能播。 这不说明可以嘛。 可以个头啊。 不说其他的就说那么多流媒体协议你支持嘛! 你支持哪个嘞。 所以嘛, 服务需要根据根据自己采用的流媒体传输协议,综合选择一个。
CDN :
CDN是个啥。 CDN就是就是一张网络传输加速方式。 你说你平时去下载的文件,下载个图片。网络慢点就慢点吧。大不了下载慢点。 可是你观看直播的时候你说你1秒中需要传输那么大那么大的数据量。 可以你还是需要经过那么多的网络节点。 那得卡到什么程度呢。 是不是的加速下。是不的少经过几个网络节点。 那CDN就是这么个技术。 说的简单啊。 但这么门nb的技术。
解码
编码的时候说了。编码就是把音频采集的是PCM编码的原始数据, 视频采集的是YUV 编码的原始数据。进行处理。 可以你播放的时候 显示器,声卡不认识, 你编码过的那是啥。 所以你还得解码。把音频解码为PCM编码的原始数据, 视频解码为YUV 编码的原始数据。
播放
播放就是用一种方式把解码出来的原始数据音频流输出到声卡,视频流输出到显示器。然后让两者同步播放的。
参考:
http://www.jianshu.com/p/ddb640ac4fec
http://blog.csdn.net/leixiaohua1020/article/details/15811977