1. 程式人生 > >iOS RTMP上推直播視訊

iOS RTMP上推直播視訊

最近收集了一些關於視訊直播的資料,目前主流的技術是上推使用RTMP協議,服務端基於nginxnginx-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上推,主要需要以下幾個步驟:

  1. 音視訊的採集;
  2. 對視訊進行H264編碼,對音訊進行AAC編碼;
  3. 對編碼後的音、視訊資料進行FLV封包;
  4. 建立RTMP連線並上推到服務端。

在音視訊的採集上,直接使用AVFoundation.frameworkAVCaptureSession即可獲得原始的CMSampleBufferRef格式音視訊資料。

而在將原始視訊編碼過程中,有兩種方案:一種是利用第三方庫FFmpeg 進行編碼,一種是利用iOS自身的AVAssetWriter 或VideoToolBox.frameworkVTCompressionSession進行編碼。FFmpeg

因其跨平臺及功能豐富等諸多優勢,被廣泛使用。而使用AVAssetWriter編碼需要將視訊寫入本地檔案,然後通過實時監聽檔案內容的改變,讀取檔案並處理封包。從iOS8開始,VideoToolBox提供了硬體編碼支援,可以使用VTCompressionSession進行編碼。

相關專案及文件

使用FFmpeg編碼:

使用iOS自身編碼:

UCloud官博的視訊直播技術文章:

VideoCore

VideoCore是一個開源的iOS平臺音視訊RTMP推流專案。支援實時濾鏡效果和水印功能。在視訊編碼方面,iOS8以下使用AVAssetWriter進行編碼:先把資料寫入本地臨時檔案appendPixelBuffer,再讀取檔案資料fread. iOS8及以上採用了VideoToolBox的硬編碼:VTCompressionSessionCreate建立session,當pushBuffer資料來時,呼叫VTCompressionSessionEncodeFrame壓縮資料。

推流的初始化過程如下,檢視大圖

預覽介面的初始化過程如下,檢視大圖

水印和濾鏡特效的初始化過程如下,檢視大圖

音視訊的編碼過程如下圖所示,檢視大圖

相關類的類圖如下,檢視大圖