1. 程式人生 > >音視訊入門

音視訊入門

最近在熟悉iOS音視訊相關的內容。音視訊主要內容包括:編解碼、封裝與解封裝、相關網路傳輸協議以及音視訊同步。

大致關係如下圖(從網上搜到的):

 

協議:

類似於http一樣,音視訊通訊有rtmp、hls等網路應用層協議,這些應用層協議規定了按照怎樣的規則對資料進行傳輸。比如hls就規定將資料進行分段,然後首先拉取一個根index檔案,之後根據這個索引檔案拉取次級索引檔案,最後根據這些索引檔案拉取到資料。

封裝:

我們平常看到的很多格式比如mp4、rmvb、avi這些其實都是封裝格式,所謂的封裝格式其實就是如何對音訊壓縮資料以及視訊壓縮資料進行組裝。同時給出音訊資料以及視訊資料同步的一些資訊。

編解碼:

編解碼的含義就是對資料進行壓縮和解壓縮,比如音訊檔案,原始取樣得到的檔案格式是pcm,一般來說初始的檔案都很大,因此我們需要使用一些演算法來對檔案進行有失真壓縮(犧牲部分音質來降低傳輸量),因此就有了編碼,音訊檔案的編碼方式有:aac、mp3,視訊檔案的編碼有:h264,這三個比較著名。

視訊檔案其實就是很多很多的圖片組成的,那麼壓縮的方式分為幀(我們把視訊檔案中的某一張圖片成為幀)內壓縮以及幀間壓縮,幀內壓縮其實就是圖片的壓縮,有jpg、png等。幀間壓縮,主要是利用相鄰幀之間具有連貫性,一般不會有太多變化這樣的一個理念來進行壓縮。

解碼就是反過來將壓縮過後的檔案重新恢復成原來的樣子(由於是有失真壓縮,所以只能變成跟原來很像的樣子)。

編解碼還分為軟編解碼和硬編解碼,說白了就是使用軟體方式還是直接使用硬體來編解碼。

音視訊同步:

平常我們看視訊,場景和聲音都是需要對應起來的,這個其實就是音視訊同步,通過解封裝獲得了音訊資料以及視訊資料,通過解碼以後需要進行同步,然後再將音視訊資料放到對應的出口進行播放。

以上就是一個完整的音視訊播放過程。

 

主要內容

具體的協議什麼的這裡就不再繼續介紹,我們需要將重心放到程式碼上來。

iOS音視訊方面分兩塊,一個是蘋果自帶的AVFoundation框架。一個就是通用的框架FFmpeg,AVFoundation框架封裝的挺好的,但是隻支援蘋果自家的hls協議,像rtmp等協議就不支援,hls用於點播(點播其實就是指我們平常觀看視訊網站的已經錄好的內容)還可以,但是對於直播的支援就很不友好,比如延遲非常的高(當然這個主要是由於協議本身造成的,需要分段載入完成才能播放)。因此很多直播網站都是採用rtmp協議來實現直播的。

到這裡FFmpeg就顯示出了它在音視訊開發中非常重要的地位,FFmpeg開源框架支援了很多音視訊通訊協議以及編解碼方式和多種封裝格式,另外iOS開源的播放器裡面比較著名的ijkplayer就是對FFmpeg中的ffplay播放器進行的封裝。因此之後的內容就是先學習FFmpeg框架的使用,然後再對AVFoundation框架的使用進行學習,最後學習一些相對重要的協議。我會將學習的一些心得同步到部落格上以記錄iOS音視訊開發中的知識與技巧。