開篇
上篇文章主要給出了代碼,但是并沒有詳細說明直播相關的知識,這篇文章就說一下直播的相關理論知識。附上直播代碼篇地址。
推流
騰訊直播平臺,阿里直播平臺,百度直播平臺提供均為RTMP的推流和HLS/RTMP等拉流.
推流是一個直播不可缺少的成分,說起推流都會說基于RTMP協議,那什么是RTMP呢?
RTMP全稱:Real Time Messaging Protocol(實時消息傳送協議)
1)、工作在TCP之上的明文協議,使用端口1935;
2)、RTMPT封裝在HTTP請求之中,可穿越防火墻;
3)、RTMPS類似RTMPT,但使用的是HTTPS連接;
RTMP協議是被Flash用 于對象、視頻、音頻的傳輸。這個協議建立在TCP協議或者輪詢HTTP協議之上。RTMP協議就像一個用來裝數據包的容器,這些數據既可以是AMF格式的 數據,也可以是FLV中的視音頻數據。一個單一的連接可以通過不同的通道傳輸多路網絡流,這些通道中的包都是按照固定大小的包傳輸的。
直播中常見的協議還有
RTSP(Real Time Streaming Protocol,實時流傳輸協議):定義了一對多應用程序 如何有效地通過IP網絡傳送多媒體數據。
RTP(Real-time Transport Protocol,實時傳輸協議):RTP是針對多媒體數據流的一種傳輸層協議,詳細說明了在互聯網上傳遞音頻和視頻的標準數據包格式。RTP協議常用于流媒體系統(配合RTCP協議),視頻會議和一鍵通系統(配合H.323或SIP),使它成為IP電話產業的技術基礎。
RTCP(Real-time Transport Control Protocol,實時傳輸控制協議):RTCP是RTP的配套協議,為RTP媒體流提供信道外的控制。RTCP和RTP一起協作將多媒體數據打包和發送,定期在多媒體流會話參與者之間傳輸控制數據。
RTCP的主要功能是為RTP所提供的服務質量(QoS)提供反饋,收集相關媒體連接的統計信息,例如傳輸字節數,傳輸分組數,丟失分組數,單向和雙向網絡延遲等等。網絡應用程序可以利用RTCP所提供的信息來提高服務質量,比如限制流量或改用壓縮比小的編解碼器。
步驟
在客戶端上要完成直播視頻的采集及RTMP上推,主要需要以下幾個步驟:
1.音視頻的采集;
2.對視頻進行H264編碼,對音頻進行AAC編碼;
3.對編碼后的音、視頻數據進行FLV封包;
4.建立RTMP連接并上推到服務端。
而在將原始視頻編碼過程中,有兩種方案:一種是利用第三方庫FFmpeg 進行編碼,一種是利用iOS自身的AVAssetWriter 或VideoToolBox.framework的VTCompressionSession進行編碼。FFmpeg因其跨平臺及功能豐富等諸多優勢,被廣泛使用。而使用AVAssetWriter編碼需要將視頻寫入本地文件,然后通過實時監聽文件內容的改變,讀取文件并處理封包。從iOS8開始,VideoToolBox提供了硬件編碼支持,可以使用VTCompressionSession進行編碼。
H264編碼與AAC編碼
- H.264編碼
還記得之前的一次面試中,談到H264編碼,當時完全不知道(-_-`).
H264是一種高壓縮率的編碼標準,如何壓縮嘞?一般的視頻采集都是25幀/秒,也就是每秒截圖25次,其實每一張圖片的內容都相差不大,壓縮的辦法就是利用算法,只將每張圖片變動差異化的部分保存下來,這樣視頻文件就小多了。這里放幾篇學習的文章,了解 H.264 編碼,iOS8系統H264視頻硬件編解碼說明,H.264硬編碼代碼。 - AAC編碼
iOS音頻AAC視頻H264編碼 推流最佳方案
服務器的搭建
說了這么多到服務器的搭建了,這里提供兩個流媒體服務器搭建的地址,按照這個地址我們可以自己搭建服務器進行推流。因為過程和截圖實在是比較詳細,我就不再重復截圖一遍了,傳送門:iOS基于RTMP 的視頻推流 與
HLS-搭建Nginx流媒體服務器(3)以及IOS手機直播Demo技術簡介。需要知道的就是,現在直播應用,采用RTMP協議居多,也有部分使用HLS協議。
采用RTMP協議,就要看下它與流媒體服務器交互的過程,RTMP協議的默認端口是1935,采用TCP協議。并且需要了解FLV的封裝格式。
拉流
直播測試的實現的總體思路大致就是,(開源推流框架:騰訊,優酷等)+ (Nginx+RTMP) + (ijkplayer)。
我們要實現我們的直播播放,就是把獲取到的數據解壓縮,恢復成原始數據。解碼就是將H264變成YUV,AAC變成PCM。
解碼可以使用軟解碼,硬解碼。
軟解碼就是利用CPU資源去解壓縮數據,采用的方式是FFmpeg解碼。
硬解碼,對于iOS平臺來說,可以使用VideoToolbox.Framework(該框架只能在iOS 8.0及以上系統使用)。為了方便我們的實現,我們采用的一般方式是第三方的SDK,網易云直播,暴風云直播,騰訊云直播,新浪云,VideoCore ,以及嗶哩嗶哩的ijkplayer等。
有比較多的SDk可以幫助我們去實現播放和推流 。
名詞介紹
- HLS
HTTP Live Streaming,HLS 是蘋果公司QuickTime X和iPhone軟件系統的一部分。它的工作原理是把整個流分成一個個小的基于HTTP的文件來下載,每次只下載一些。當媒體流正在播放時,客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會話適應不同的數據速率。在開始一個流媒體會話時,客戶端會下載一個包含元數據的extended M3U (m3u8) playlist文件,用于尋找可用的媒體流。
這里介紹兩個介紹比較不錯的文章如何使用iOS實現《羋月傳》的直播、點播、緩存?-HTTP Live Streaming (HLS)(一),如何使用iOS實現《羋月傳》的直播、點播、緩存?-HTTP Live Streaming (HLS)(二)
后記
本來還想自己多寫寫來著,但是知道看了一篇知乎,覺得自己確實漲了不少知識,這里放上鏈接,如何搭建一個完整的視頻直播系統?我自己先去好好看看了。
通過我的學習與研究后續再更新吧。 轉載注明出處和網址。