iOS 開發直播 App(基礎篇)
1.直播app原理
直播原理:把主播錄制的視頻,推送到服務器,然后由服務器CDN分發給觀眾。
2.直播app流程
簡單的流程:采集->濾鏡處理->編碼->推流->CDN分發->拉流->解碼->播放
直播環節:推流端(采集、美顏處理、編碼、推流)、服務端(轉碼、錄制、截圖)、播放端(拉流、解碼、渲染)、互動(聊天、點亮、禮物)
流程圖如下:
直播流程.png
3.直播架構
直播架構.png
二、直播基礎知識
1、采集視頻、音頻
AVFoundation: AVFoundation是用來播放和創建基于時間的視聽媒體的框架,它提供了Objective-C接口來處理這些數據,比如創建、編輯、重新編碼、回放等。
2.視頻處理(美顏)
利用OpenGL ES開源圖形嵌入式系統框架,對視頻幀進行加工,通過GPU渲染到屏幕,從而實現各種不同的視頻效果。一般情況下app的個各種美顏和視頻特效都是通過GPUImage這個框架實現的。
相關視頻框架介紹
GPUImage:GPUImage是一個基于OpenGL ES的一個圖像視頻處理框架,封裝了多達120多種常見的濾鏡效果,同時也支持自定義編寫濾鏡效果。
OpenGL(Open Graphics Library):是一個跨編程語言、跨平臺的編程接口規定的專業的圖形程序接口,是一個功能強大、調用方便的底層圖形庫。
OpenGL ES(OpenGL for Embedded Systems ):是OpenGL三維圖形API的子集,針對手機等嵌入式設備而設計。
3.視頻編碼解碼
視頻編碼框架
FFmpeg:是一個跨平臺開源視頻框架,提供了視頻錄制、轉換以及流化音視頻的解決方案,也就是視頻編碼、解碼、轉碼、轉流、播放等功能。FFmpeg支持了幾乎所有音視頻編解碼、封裝格式以及播放協議。它包含非常先進的了音頻、視頻編解碼庫libavcodec,保證了編解碼的質量。
ps:
1. X264:把視頻原數據YUV編碼壓縮成H.264格式;
2.VideoToolbox:蘋果自帶的視頻硬解碼和硬編碼API;
3.AudioToolbox:蘋果自帶的音頻硬解碼和硬編碼API。
視頻編碼
視頻壓縮標準:MPEG、H.264等,對視頻進行壓縮(視頻編碼)或者解壓縮(視頻解碼)的編碼技術,主要是將視頻像素壓縮成為視頻碼流,從而達到降低視頻數量的目的。
1.MPEG:一種視頻壓縮方式,采用幀間壓縮,存儲連續幀之間有差別的地方達到較大的壓縮比;
2.H.264:一種視頻壓縮方式,采用事先預測和與MPEG中的P-B幀一樣的幀間預測方法壓縮,可以根據需要產生適合網絡情況傳輸的視頻流,有更高的壓縮比和更好的圖像質量;
3.H.265:基于H.264的一種視頻壓縮方式,保留原有的技術,并且對一些技術進行優化以改善碼流、編碼質量、延時和算法復雜度之間的關系。
音頻編碼
AAC、mp3:對音頻壓縮的音頻編碼技術。
碼率控制
多碼率:根據用戶當前網絡環境自定義碼率,例如視頻播放軟件中的1024、720、高清、標清、流暢等就是碼率。
視頻封裝格式
TS:流媒體封裝格式,流媒體封裝格式的好處就是不需要加載索引再播放,大大減少了首次載入的延遲。
FLV:流媒體封裝格式,由于其形成的文件極小、加載速度極快,使其成為當前主流視頻格式。
4.推流
librtmp:數據傳輸框架,用來傳輸RTMP協議格式的數據
RTMP:流媒體數據傳輸協議,是Flash播放器和服務器之間音頻、視頻和數據傳輸開發的開發協議,這個協議是建立在TCP協議或者輪訓HTTP協議,主要用于對象、視頻、音頻的傳輸。
5.流媒體服務器
SRS、BMS、nginx
5.1數據分發
CDN:(Content Delivery Network),內容分發網絡,是構建在網絡之上的內容分發網絡,依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。
6.拉流
直播協議
RTMP、RTSP:即時要求較高或有互動需求
HLS:有回放或者跨平臺需求
對比:
HLS是Apple公司定義的用于實時流傳輸的協議,HLS協議基于HTTP協議實現,可實現流媒體的直播和點播,主要用于iOS系統。HLS的自適應碼率流播,客戶端可以根據網絡狀況自動選擇不同碼率的視頻流,保證了移動設備網絡狀況不穩定的條件下流暢播放。
RTSP:
實時流傳輸協議,該協議定義了一對多應用程序如何有效地通過IP網絡傳送多媒體數據。HTTP與RTSP相比,HTTP請求由客戶機發出,服務器作出響應;使用RTSP時,客戶機和服務器都可以發出請求,即RTSP可以是雙向的。
HTTP-FLV:基于HTTP協議的流式傳輸協議
7.解碼
硬解碼:使用GPU來解碼,減少CPU運算。播放流暢、解碼速度快,但兼容性不好。
軟解碼:使用CPU來解碼。兼容性好,但加大CPU負擔,功耗大,解碼速度慢,沒有硬解碼流暢。
8.播放
使用ijkplayer這個基于FFmpeg的開源視頻播放器,iOS、Android都可集成,使用簡單,使用指定拉流URL,自動解碼播放。
9.聊天
IM即時通訊,在直播中主要是觀眾與主播間的文字互動。
第三方SDK:融云、 騰訊云都提供了即時通訊的SDK,實現直播聊天的功能。
10.第三方直播SDK
七牛云、網易視頻云提供了全球化直播流服務,提供穩定流暢、低耗時、高并發的實時音頻服務,可將視頻直播快速集成到自己的app當中。
ps:
mac測試服務器:采用nginx+rtmp搭建,地址:http://www.jianshu.com/p/a0397c98d907。
拉流端:bilibili站有一個開源項目叫ijkplayer,用起來很不錯,地址:https://github.com/Bilibili/ijkplayer。
參考文獻
http://blog.csdn.net/leixiaohua1020/article/details/15814587
http://www.jianshu.com/p/bd42bacbe4cc
來自:http://www.jianshu.com/p/6f0d69ea7eb6