楔子
筆者iOS開發工程師,現在很多應用場景下都會用到視頻播放技術,當然iOS APP也不例外,這是寫這篇文章的背景。
最近我一個同樣做iOS工程師的同學說他最近面試了一個人,簡歷里寫著做過視頻播放,就問他基本的視頻播放原理是什么,結果此人一臉懵逼狀什么也沒答上來,只是說會用iOS SDK下調用視頻播放的幾個API。我同學跟我說他就是想問問此人計算機基礎怎么樣,其實只要應聘者能說出“解碼”兩個字都會讓他滿意的,可惜他卻什么也沒說出來。這又讓筆者想起幾年前臨近大學畢業時同寢室友校招面試時也遇到了同樣的問題,他也做過視頻播放,人家就問他其中有兩個問題,一是如果現在有一種非常奇怪的格式的視頻讓你播放你該怎么辦,他也是懵逼了。二是如果現在有一個1G的超大視頻讓你播放,你又該怎么辦,他直接就傻了,面試自然折戟沉沙了。
正題
事實上僅就iOS APP來講,要想做出視頻播放的功能來,的確是調用AVFoundation
框架下幾個常用的API就可以了,iOS 9 之前常用的是MPMoviePlayerController
,ios 9 之后推薦使用流播放技術的AVPlayer
,可是就像常說的API普通的程序員都會調,可是真正有專業基礎和想進階就要知其然還要知其所以然,有專業基礎的和半路出家的程序員的最大區別也正在于此,這也就成了本片文章寫作的契機,下面這些內容也是筆者整合了一些自己的一些積累,主要來源于我們有合作關系的一家叫保利威視的視頻解決方案提供商,希望對大家有幫助,水平有限,有不足之處還請大家不吝賜教。
視音頻技術主要包含以下幾點:** 封裝技術,視頻壓縮編碼技術以及音頻壓縮編碼技術。如果考慮到網絡傳輸的話,還包括流媒體協議技術。**
視頻播放器播放網上的視頻文件,需要經過以下幾個步驟:** 解協議,解封裝,解碼視音頻,視音頻同步**。如果播放本地文件則不需要解協議,為以下幾個步驟:解封裝,解碼視音頻,視音頻同步。過程如圖所示。
-
解協議
解協議的作用,就是將流媒體協議的數據,解析為標準的相應的封裝格式數據。視音頻在網絡上傳播的時候,常常采用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,采用RTMP協議傳輸的數據,經過解協議操作后,輸出FLV格式的數據。
-
解封裝
解封裝的作用,就是將輸入的封裝格式的數據,分離成為音頻流壓縮編碼數據和視頻流壓縮編碼數據。封裝格式種類很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是將已經壓縮編碼的視頻數據和音頻數據按照一定的格式放到一起。例如,FLV格式的數據,經過解封裝操作后,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。
-
解碼
解碼的作用,就是將視頻/音頻壓縮編碼數據,解碼成為非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3,AC-3等等,視頻的壓縮編碼標準則包含H.264,MPEG2,VC-1等等。解碼是整個系統中最重要也是最復雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成為非壓縮的顏色數據,例如YUV420P,RGB等等;壓縮編碼的音頻 數據輸出成為非壓縮的音頻抽樣數據,例如PCM數據。
-
視音頻同步
視音頻同步的作用,就是根據解封裝模塊處理過程中獲取到的參數信息,同步解碼出來的視頻和音頻數據,并將視頻音頻數據送至系統的顯卡和聲卡播放出來。