最簡單的iOS 推流代碼,視頻捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新代碼解析,你想學的知識這裏都有,願意懂直播技術的同窗快來看!!git
源代碼:https://github.com/hardman/AWLivegithub
前面介紹瞭如何捕獲音視頻原始數據,介紹了yuv和pcm。數組
下面來介紹一下咱們的想要轉換的目標音視頻格式:h264,aac,flv。bash
這裏就不貼名詞解釋了。服務器
說明一下,爲何須要這種格式。架構
其實除了h264格式以外,視頻格式有不少種,出現這些格式緣由無非有3種。ide
1. 壓縮尺寸。
咱們來計算一下:
yuv420格式,寬度爲480,高度爲320的視頻,每一幀 須要 480*320*3/2 = 230400 字節。
假設視頻每秒20幀,那麼30秒的視頻 是 230400 * 20 * 30 = 138240000 字節 大約138M。
你可能以爲不是很大,可是這個分辨率一樣清晰度的h264視頻可能只須要1-2M左右(固然也跟碼率和I幀數量等因素有關)。
2. 爲了與當前產品業務匹配,或者版權專利等緣由,創造一種獨特的格式。
好比QuickTime,WMV等。
3. 對當前技術的改進。
h264正是對h263的改進。
複製代碼
h264 怎麼壓縮視頻數據呢?post
最重要的一點是將視頻幀分爲關鍵幀和非關鍵幀。ui
關鍵幀的數據是完整的。包含了全部的顏色數據。這樣的視頻幀稱爲I幀。編碼
非關鍵幀數據不完整,可是它可以根據前面或者後面的幀數據,甚至本身的部分幀數據,將自身數據補充完整。這種視頻幀被稱爲 B/P 幀。
整體來講,h264跟yuv相比,最大的不一樣就是它是壓縮的(一般此過程稱爲編碼,不僅是簡單的壓縮)。
aac同h264性質同樣,它也是pcm的壓縮(編碼)格式。
mp3你們都據說過,之前聽歌保存到電腦裏的歌曲90%都是mp3格式。
aac 相對 mp3來講,是更先進的壓縮格式。
h264是視頻編碼格式。
aac是音頻編碼格式。
除了這兩種格式以外,還有一種將視頻和音頻合成(muxer 這個詞會在相關代碼中常常出現)在一塊兒的格式。
好比:mp4,avi,rmvb,flv。
flv 是一種簡單的視頻合成格式。
它支持指定的音視頻格式,如:h263,h264,VP6 及 AAC,MP3,Nellymoser等。
簡單說來,flv的組成以下:
flv header + script tag + video tag + audio tag + ... + video tag + audio tag
複製代碼
flv由 flv header 和無數的tag組成的。
flv header 內容是固定的。
一個tag就像是一個數組中的元素。是一個單獨的儲存了信息的數據塊。
script tag 內存儲了視頻相關信息,如:寬高,碼率,fps,文件大小,音頻信息等等。
video tag 中 存儲的是完整的視頻壓縮格式的一幀數據,如h264數據。
audio tag 中 存儲的是完整的音頻壓縮格式的一幀數據,如 aac數據。
這樣把全部數據拼接在一塊兒,寫入文件。這個文件就是flv格式。可使用播放器播放了。
而flv恰好支持 h264 和 aac。
爲何介紹flv呢?
由於rtmp協議所傳輸的視頻流,就要求是flv格式。
因此,程序從相機和麥克風捕獲到音視頻數據後,分別轉成 aac和h264格式的音視頻幀。
而後將aac和h264音視頻幀合成flv格式的視頻後發送到rtmp服務器。客戶端就能夠播放咱們推的流了。
注:上述內容不必定夠精確,以容易理解爲上。