項目都是我的的調研與實驗,可能不少很差或者不對的地方請多包涵。shell
1 功能概況xcode
* 實現音視頻的數據的採集服務器
* 實現音視頻數據的編碼,視頻編碼成h264,音頻編碼成aac框架
* 實現音視頻數據的發佈,將編碼好的音視頻數據傳輸到服務器函數
2 視頻和音頻編碼方案編碼
視頻硬編碼須要使用AVAssetWriter,可是他只支持直接將數據編碼成h264並寫入文件,不提供接口中途獲取視頻數據處理,咱們須要在保存的文件中讀出數據code
據頂採用軟編碼,主流開源編解碼器Xvid,x264,ffmpeg,Xvid是基於MPEG4協議的編解碼器,x264是基於H.264協議的編碼器,ffmpeg集合了各類音頻,視頻編解碼協議,經過設置參數能夠完成基於MPEG4,H.264等協議的編解碼,基於效率,決定使用x264進行軟編視頻
Ios支持aac音頻軟編碼和硬編碼,硬編無需消耗cpu,效率高,決定使用硬編。使用Audio Queueblog
3. 技術流程圖接口
4 相關技術
(1)x264編碼器
x264是一個採用GPL受權的視頻編碼自由軟件[1]。x264的主要功能在於進行H.264/MPEG-4 AVC的視頻編碼,而不是做爲解碼器(decoder)之用。
(2) 在xcode下編譯x264庫
* 下載x264的庫
* 打開shell,執行編譯,因爲咱們的飲食頻道額採集在模擬器上不能進行,因此不編譯i386的庫,直接編譯armv7的庫
* 執行make,編譯成功獲得libx264.a
(3) Audioqueue簡介
要在iOS設備上播放和錄製音頻,蘋果推薦咱們使用AVFoundation框架中的AVAudioPlayer和AVAudioRecorder類。雖然用法比較簡單,可是不支持流式;這就意味着:在播放音頻前,必須等到整個音頻加載完成後,才能開始播放音頻;錄音時,也必須等到錄音結束後,才能獲取到錄音數據。這給應用形成了很大的侷限性。爲了解決這個問題,咱們就須要使用Audio Queue Services來播放和錄製音頻.
Audio Queue Services提供了在iOS 和 Mac OS X上直接錄製和播放各類格式的音頻,他能讓你的應用程序在沒有硬件接口知識的狀況下使用硬件錄音和播放設備,如microphones 和loudspeakers。
(4) Audioqueue錄製音頻過程
一個Recording Audio Queue,包括Buffer(緩衝器)組成的Buffer Queue(緩衝隊列),以及一個Callback(回調)
錄音流程以下:
l 將音頻填入第一個緩衝器中
l 當隊列中的第一個緩衝器填滿時,會自動填充下一個緩衝器。此時,會觸發回調。
l 在回調函數中須要將音頻數據流寫入磁盤
l 而後,須要在回調函數中將該緩衝器從新放入緩衝隊列,以便重複使用該緩衝器。重複步驟2。
Audio Queue錄製aac音頻數據以下流程:
5 rtmp發送音視頻
xcode中編譯librtmp庫
在xcode中使用librtmp庫可將音視頻數據打成包,遵循rtmp協議,將數據發送到指定服務器,前提須要編譯librtmp庫並在xcode中使用此庫
* 下載rtmpdump源碼
* shell下編譯librtmp成librtmp.a並加入到xcode工程
* 拷貝rtmpdump的include文件夾到xcode下的相應工程,並將路徑添加到User Header SearchPaths
* 在工程中引入使用librtmp
6. 音視頻同步
採用時間戳技術,時間戳即爲一幀的採集時間,音視頻採起同一個參考時間,給每一個幀打上時間戳
待續。。。