iOS RTMP上推直播視訊
最近收集了一些關於視訊直播的資料,目前主流的技術是上推使用RTMP協議,服務端基於nginx的nginx-rtmp-module
模組來增加對HLS的支援,下行播放支援RTMP協議和HLS協議。
- RTMP協議
Real Time Messaging Protocol 是Adobe公司為Flash播放器和伺服器之間音、視訊及資料傳輸開發的實時訊息傳送協議。協議中,視訊必須是H264編碼,音訊必須是AAC或MP3編碼,且多以flv格式封包。
- HLS協議
Http Live Streaming 是由Apple公司定義的基於HTTP的流媒體實時傳輸協議。它的原理是將整個流分為一個一個小的檔案來下載,每次只下載若干個。傳輸內容包括兩部分:一是M3U8描述檔案,二是TS媒體檔案。TS媒體檔案中的視訊必須是H264編碼,音訊必須是AAC或MP3編碼。
在客戶端上要完成直播視訊的採集及RTMP上推,主要需要以下幾個步驟:
- 音視訊的採集;
- 對視訊進行H264編碼,對音訊進行AAC編碼;
- 對編碼後的音、視訊資料進行FLV封包;
- 建立RTMP連線並上推到服務端。
在音視訊的採集上,直接使用AVFoundation.framework
的AVCaptureSession
即可獲得原始的CMSampleBufferRef
格式音視訊資料。
而在將原始視訊編碼過程中,有兩種方案:一種是利用第三方庫FFmpeg 進行編碼,一種是利用iOS自身的AVAssetWriter
或VideoToolBox.framework的VTCompressionSession
進行編碼。FFmpeg
AVAssetWriter
編碼需要將視訊寫入本地檔案,然後通過實時監聽檔案內容的改變,讀取檔案並處理封包。從iOS8開始,VideoToolBox
提供了硬體編碼支援,可以使用VTCompressionSession
進行編碼。
相關專案及文件
使用FFmpeg編碼:
使用iOS自身編碼:
UCloud官博的視訊直播技術文章:
VideoCore
VideoCore是一個開源的iOS平臺音視訊RTMP推流專案。支援實時濾鏡效果和水印功能。在視訊編碼方面,iOS8以下使用AVAssetWriter進行編碼:先把資料寫入本地臨時檔案appendPixelBuffer,再讀取檔案資料fread. iOS8及以上採用了VideoToolBox的硬編碼:VTCompressionSessionCreate建立session,當pushBuffer資料來時,呼叫VTCompressionSessionEncodeFrame壓縮資料。
推流的初始化過程如下,檢視大圖:
預覽介面的初始化過程如下,檢視大圖:
水印和濾鏡特效的初始化過程如下,檢視大圖:
音視訊的編碼過程如下圖所示,檢視大圖:
相關類的類圖如下,檢視大圖: