音视频处理
数据采集。对于音频来说采集到的数据是PCM格式,对于视频数据采集的格式是YUV格式。
数据压缩编码。数据采集完成之后,需要对数据进行压缩编码。音视频使用的压缩技术称为有损压缩技术。而像我们平RAR,ZIP工具进行的压缩都是无损压缩。就是说解压后的数据与原始数据一样叫做无损压缩,解压后和原始数据高度接近称为有损压缩,音视频编码属于后者。对于音频来讲,常用的编码格式有speex, AAC, OPUS, G.711等。现在比较常用的是AAC,一是它音质比较好,二是RTMP对AAC支持的比较好。对于视频编码格式有H.264, H.265, VP8, VP9等,目常基本上都是使用H.264。注意,衡量有损压缩好坏的指标就是看同等压缩率的情况下,解压后的数据与原始数据之间差别的大小,差别越小证明压缩的算法越优。当然在实时互动直播中,我们为了实时性就需要牺牲一部分质量或者也有可能为了质量而牺牲一些实时性,这需要仔细的权衡。
传输。数据压缩完之后通过网络传输。对于泛娱乐化的直播平台一般都使用RTMP协议进行数据的传输,RTMP是在TCP之上的网络协议。对于实时互动直播则必须使用UDP进行数据传输。 UDP数据的传输速度上比TCP有天然的优势。RTMP是Adobe公司发明一种传输协议,目前所有的CDN网络对RTMP的支持是非常好的,但它的问题就是延迟性比较大。使用RTMP造成延迟主要有两个方面原因,一是RTMP网络协议由于是基于TCP协议的,本身延迟就比UDP大,另一方面是CDN架构造成的。CDN首先从顶级结点接收数据,然后以树状形式分发到端结点,这个过程链条比较长,导致整体的延迟非常大。而且延迟时间不固定,有可能某段时间延迟3、5秒,也有可能过一段时间延迟就达到了30秒这都是有可能的。
解码。就是将对编码数据做反向操作。如音频是AAC编码,则它再解为PCM格式数据。视频是H.264再解为YUV数据。
播放和渲染。对于音频直接将PCM数据放入到音频驱动缓冲驱,驱动程序就会将音频播放出来。对于视频一般会通过 opengl利用 GPU进行图像渲染。