最簡單的iOS 推流代碼,視頻捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新代碼解析,你想學的知識這里都有,愿意懂直播技術的同學快來看!!
前面介紹了如何捕獲音視頻原始數據,介紹了yuv和pcm。
下面來介紹一下我們的想要轉換的目標音視頻格式:h264,aac,flv。
什么是h264?
這里就不貼名詞解釋了。
說明一下,為什么需要這種格式。
其實除了h264格式之外,視頻格式有很多種,出現這些格式原因無非有3種。
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 怎么壓縮視頻數據呢?
最重要的一點是將視頻幀分為關鍵幀和非關鍵幀。
關鍵幀的數據是完整的。包含了所有的顏色數據。這樣的視頻幀稱為I幀。
非關鍵幀數據不完整,但是它能夠根據前面或者后面的幀數據,甚至自己的部分幀數據,將自身數據補充完整。這種視頻幀被稱為 B/P 幀。
總體來說,h264跟yuv相比,最大的不同就是它是壓縮的(通常此過程稱為編碼,不只是簡單的壓縮)。
什么是aac
aac同h264性質一樣,它也是pcm的壓縮(編碼)格式。
mp3大家都聽說過,以前聽歌保存到電腦里的歌曲90%都是mp3格式。
aac 相對 mp3來說,是更先進的壓縮格式。
什么是flv
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服務器。客戶端就可以播放我們推的流了。
注:上述內容不一定夠精確,以容易理解為上。
文章列表
- 1小時學會:最簡單的iOS直播推流(一)項目介紹
- 1小時學會:最簡單的iOS直播推流(二)代碼架構概述
- 1小時學會:最簡單的iOS直播推流(三)使用系統接口捕獲音視頻
- 1小時學會:最簡單的iOS直播推流(四)如何使用GPUImage,如何美顏
- 1小時學會:最簡單的iOS直播推流(五)yuv、pcm數據的介紹和獲取
- 1小時學會:最簡單的iOS直播推流(六)h264、aac、flv介紹
- 1小時學會:最簡單的iOS直播推流(七)h264/aac 硬編碼
- 1小時學會:最簡單的iOS直播推流(八)h264/aac 軟編碼
- 1小時學會:最簡單的iOS直播推流(九)flv 編碼與音視頻時間戳同步
- 1小時學會:最簡單的iOS直播推流(十)librtmp使用介紹
- 1小時學會:最簡單的iOS直播推流(十一)sps&pps和AudioSpecificConfig介紹(完結)