音視頻處理
數據采集。對于音頻來說采集到的數據是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進行圖像渲染。