直播難
:個人認為要想把直播從零開始做出來,絕對是牛逼中的牛逼,大牛中的大牛,因為直播中運用到的技術難點非常之多,視頻/音頻處理,圖形處理,視頻/音頻壓縮,CDN分發(fā),即時通訊等技術,每一個技術都夠你學幾年的。
直播易
:已經(jīng)有各個領域的大牛,封裝好了許多牛逼的框架,我們只需要用別人寫好的框架,就能快速的搭建一個直播app,也就是傳說中的站在大牛肩膀上編程。
映客,斗魚,熊貓,虎牙,花椒等等
聊天
禮物
直播列表
自己直播
房間邏輯
用戶邏輯
觀看直播
統(tǒng)計
超管
直播原理
:把主播錄制的視頻,推送到服務器,在由服務器分發(fā)給觀眾觀看。
直播環(huán)節(jié)
:推流端(采集、美顏處理、編碼、推流)、服務端處理(轉碼、錄制、截圖、鑒黃)、播放器(拉流、解碼、渲染)、互動系統(tǒng)(聊天室、禮物系統(tǒng)、贊)
1.采集、2.濾鏡處理、3.編碼、4.推流、5.CDN分發(fā)、6.拉流、7.解碼、8.播放、9.聊天互動
流媒體開發(fā)
:網(wǎng)絡層(socket或st)負責傳輸,協(xié)議層(rtmp或hls)負責網(wǎng)絡打包,封裝層(flv、ts)負責編解碼數(shù)據(jù)的封裝,編碼層(h.264和aac)負責圖像,音頻壓縮。幀
:每幀代表一幅靜止的圖像GOP
:(Group of Pictures)畫面組,一個GOP就是一組連續(xù)的畫面,每個畫面都是一幀,一個GOP就是很多幀的集合碼率
:圖片進行壓縮后每秒顯示的數(shù)據(jù)量。幀率
:每秒顯示的圖片數(shù)。影響畫面流暢度,與畫面流暢度成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。分辨率
:(矩形)圖片的長度和寬度,即圖片的尺寸壓縮前的每秒數(shù)據(jù)量
:幀率X分辨率(單位應該是若干個字節(jié))壓縮比
:壓縮前的每秒數(shù)據(jù)量/碼率 (對于同一個視頻源并采用同一種視頻編碼算法,則:壓縮比越高,畫面質量越差。)視頻文件格式
:文件的后綴
,比如.wmv,.mov,.mp4,.mp3,.avi
,主要用處
,根據(jù)文件格式,系統(tǒng)會自動判斷用什么軟件打開,視頻封裝格式
:一種儲存視頻信息的容器
,流式封裝可以有TS、FLV
等,索引式的封裝有MP4,MOV,AVI
等,主要作用
:一個視頻文件往往會包含圖像和音頻,還有一些配置信息(如圖像和音頻的關聯(lián),如何解碼它們等):這些內容需要按照一定的規(guī)則組織、封裝起來.注意
:會發(fā)現(xiàn)封裝格式跟文件格式一樣,因為一般視頻文件格式的后綴名即采用相應的視頻封裝格式的名稱,所以視頻文件格式就是視頻封裝格式。視頻封裝格式和視頻壓縮編碼標準
:就好像項目工程和編程語言,封裝格式就是一個項目的工程,視頻編碼方式就是編程語言,一個項目工程可以用不同語言開發(fā)。* 1.1 采集視頻、音頻編碼框架 *
AVFoundation
:AVFoundation是用來播放和創(chuàng)建實時的視聽媒體數(shù)據(jù)的框架,同時提供Objective-C接口來操作這些視聽數(shù)據(jù),比如編輯,旋轉,重編碼* 1.2 視頻、音頻硬件設備 *
CCD
:圖像傳感器: 用于圖像采集和處理的過程,把圖像轉換成電信號。拾音器
:聲音傳感器: 用于聲音采集和處理的過程,把聲音轉換成電信號。音頻采樣數(shù)據(jù)
:一般都是PCM格式視頻采樣數(shù)據(jù)
: 一般都是YUV
,或RGB
格式,采集到的原始音視頻的體積是非常大的,需要經(jīng)過壓縮技術處理來提高傳輸效率視頻處理原理
:因為視頻最終也是通過GPU,一幀一幀渲染到屏幕上的,所以我們可以利用OpenGL ES,對視頻幀進行各種加工,從而視頻各種不同的效果,就好像一個水龍頭流出的水,經(jīng)過若干節(jié)管道,然后流向不同的目標
GPUImage
這個框架實現(xiàn)的,.* 視頻處理框架 *
GPUImage
: GPUImage是一個基于OpenGL ES的一個強大的圖像/視頻處理框架,封裝好了各種濾鏡同時也可以編寫自定義的濾鏡,其本身內置了多達120多種常見的濾鏡效果。OpenGL
:OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平臺的編程接口的規(guī)格,它用于三維圖象(二維的亦可)。OpenGL是個專業(yè)的圖形程序接口,是一個功能強大,調用方便的底層圖形庫。OpenGL ES
:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和游戲主機等嵌入式設備而設計。* 3.1 視頻編碼框架 *
FFmpeg
:是一個跨平臺的開源視頻框架,能實現(xiàn)如視頻編碼,解碼,轉碼,串流,播放等豐富的功能。其支持的視頻格式以及播放協(xié)議非常豐富,幾乎包含了所有音視頻編解碼、封裝格式以及播放協(xié)議。X264
:把視頻原數(shù)據(jù)YUV編碼壓縮成H.264格式VideoToolbox
:蘋果自帶的視頻硬解碼和硬編碼API,但是在iOS8之后才開放。AudioToolbox
:蘋果自帶的音頻硬解碼和硬編碼API* 3.2 視頻編碼技術 *
視頻壓縮編碼標準
:對視頻進行壓縮(視頻編碼)或者解壓縮(視頻解碼)的編碼技術
,比如MPEG
,H.264
,這些視頻編碼技術是壓縮編碼視頻的主要作用
:是將視頻像素數(shù)據(jù)壓縮成為視頻碼流,從而降低視頻的數(shù)據(jù)量。如果視頻不經(jīng)過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。注意
:最影響視頻質量的是其視頻編碼數(shù)據(jù)和音頻編碼數(shù)據(jù),跟封裝格式?jīng)]有多大關系MPEG
:一種視頻壓縮方式,它采用了幀間壓縮,僅存儲連續(xù)幀之間有差別的地方 ,從而達到較大的壓縮比H.264/AVC
:一種視頻壓縮方式,采用事先預測和與MPEG中的P-B幀一樣的幀預測方法壓縮,它可以根據(jù)需要產(chǎn)生適合網(wǎng)絡情況傳輸?shù)囊曨l流,還有更高的壓縮比,有更好的圖象質量注意1
:如果是從單個畫面清晰度比較,MPEG4有優(yōu)勢;從動作連貫性上的清晰度,H.264有優(yōu)勢注意2
:由于264的算法更加復雜,程序實現(xiàn)煩瑣,運行它需要更多的處理器和內存資源。因此,運行264對系統(tǒng)要求是比較高的。注意3
:由于264的實現(xiàn)更加靈活,它把一些實現(xiàn)留給了廠商自己去實現(xiàn),雖然這樣給實現(xiàn)帶來了很多好處,但是不同產(chǎn)品之間互通成了很大的問題,造成了通過A公司的編碼器編出的數(shù)據(jù),必須通過A公司的解碼器去解這樣尷尬的事情H.265/HEVC
:一種視頻壓縮方式,基于H.264,保留原來的某些技術,同時對一些相關的技術加以改進,以改善碼流、編碼質量、延時和算法復雜度之間的關系,達到最優(yōu)化設置。I幀
:(關鍵幀)保留一副完整的畫面,解碼時只需要本幀數(shù)據(jù)就可以完成(因為包含完整畫面)P幀
:(差別幀)保留這一幀跟之前幀的差別,解碼時需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù))B幀
:(雙向差別幀)保留的是本幀與前后幀的差別,解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累幀內(Intraframe)壓縮
:當壓縮一幀圖像時,僅考慮本幀的數(shù)據(jù)而不考慮相鄰幀之間的冗余信息,幀內一般采用有損壓縮算法幀間(Interframe)壓縮
:時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的數(shù)據(jù)進行壓縮。幀間壓縮一般是無損的muxing(合成)
:將視頻流、音頻流甚至是字幕流封裝到一個文件中(容器格式(FLV,TS)
),作為一個信號進行傳輸。* 3.3 音頻編碼技術 *
AAC
,mp3
:這些屬于音頻編碼技術,壓縮音頻用* 3.4碼率控制 *
多碼率
:觀眾所處的網(wǎng)絡情況是非常復雜的,有可能是WiFi,有可能4G、3G、甚至2G,那么怎么滿足多方需求呢?多搞幾條線路,根據(jù)當前網(wǎng)絡環(huán)境自定義碼率。* 3.5 視頻封裝格式 *
TS
: 一種流媒體封裝格式,流媒體封裝有一個好處,就是不需要加載索引再播放,大大減少了首次載入的延遲,如果片子比較長,mp4文件的索引相當大,影響用戶體驗為什么要用TS
:這是因為兩個TS片段可以無縫拼接,播放器能連續(xù)播放FLV
: 一種流媒體封裝格式,由于它形成的文件極小、加載速度極快,使得網(wǎng)絡觀看視頻文件成為可能,因此FLV格式成為了當今主流視頻格式* 4.1 數(shù)據(jù)傳輸框架 *
librtmp
:用來傳輸RTMP協(xié)議格式的數(shù)據(jù)
* 4.2 流媒體數(shù)據(jù)傳輸協(xié)議 *
RTMP
:實時消息傳輸協(xié)議,Adobe Systems公司為Flash播放器和服務器之間音頻、視頻和數(shù)據(jù)傳輸開發(fā)的開放協(xié)議,因為是開放協(xié)議所以都可以使用了。chunk
:消息包
* 5.1常用服務器 *
SRS
:一款國人開發(fā)的優(yōu)秀開源流媒體服務器系統(tǒng)BMS
:也是一款流媒體服務器系統(tǒng),但不開源,是SRS的商業(yè)版,比SRS功能更多nginx
:免費開源web服務器,常用來配置流媒體服務器。* 5.2數(shù)據(jù)分發(fā) *
CDN
:(Content Delivery Network),即內容分發(fā)網(wǎng)絡,將網(wǎng)站的內容發(fā)布到最接近用戶的網(wǎng)絡”邊緣”,使用戶可以就近取得所需的內容,解決 Internet網(wǎng)絡擁擠的狀況,提高用戶訪問網(wǎng)站的響應速度.CDN
:代理服務器,相當于一個中介。CDN工作原理
:比如請求流媒體數(shù)據(jù)回源
:當有用戶訪問某一個URL的時候,如果被解析到的那個CDN節(jié)點沒有緩存響應的內容,或者是緩存已經(jīng)到期,就會回源站
去獲取搜索。如果沒有人訪問,那么CDN節(jié)點不會主動去源站
拿.帶寬
:在固定的時間可傳輸?shù)臄?shù)據(jù)總量,負載均衡
: 由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助.QoS(帶寬管理)
:限制每一個組群的帶寬,讓有限的帶寬發(fā)揮最大的效用直播協(xié)議選擇
:RTMP
,RTSP
HLS
直播協(xié)議對比
:HLS
:由Apple公司定義的用于實時流傳輸?shù)膮f(xié)議,HLS基于HTTP協(xié)議實現(xiàn),傳輸內容包括兩部分,一是M3U8描述文件,二是TS媒體文件。可實現(xiàn)流媒體的直播和點播,主要應用在iOS系統(tǒng)以點播的技術方式
來實現(xiàn)直播自適應碼率流播
,客戶端會根據(jù)網(wǎng)絡狀況自動選擇不同碼率的視頻流,條件允許的情況下使用高碼率,網(wǎng)絡繁忙的時候使用低碼率,并且自動在二者間隨意切HLS與RTMP對比
:HLS主要是延時比較大,RTMP主要優(yōu)勢在于延時低HTTP-FLV
:基于HTTP協(xié)議流式的傳輸媒體內容。RTSP
:實時流傳輸協(xié)議,定義了一對多應用程序如何有效地通過IP網(wǎng)絡傳送多媒體數(shù)據(jù).RTP
:實時傳輸協(xié)議,RTP是建立在UDP協(xié)議上的,常與RTCP一起使用,其本身并沒有提供按時發(fā)送機制或其它服務質量(QoS)保證,它依賴于低層服務去實現(xiàn)這一過程。RTCP
:RTP的配套協(xié)議,主要功能是為RTP所提供的服務質量(QoS)提供反饋,收集相關媒體連接的統(tǒng)計信息,例如傳輸字節(jié)數(shù),傳輸分組數(shù),丟失分組數(shù),單向和雙向網(wǎng)絡延遲等等。* 7.1 解封裝 *
demuxing(分離)
:從視頻流、音頻流,字幕流合成的文件(容器格式(FLV,TS)
)中, 分解出視頻、音頻或字幕,各自進行解碼。* 7.2 音頻編碼框架 *
fdk_aac
:音頻編碼解碼框架,PCM音頻數(shù)據(jù)和AAC音頻數(shù)據(jù)互轉* 7.3 解碼介紹 *
硬解碼
:用GPU來解碼,減少CPU運算軟解碼
:用CPU來解碼IM
:(InstantMessaging)即時通訊:是一個實時通信系統(tǒng),允許兩人或多人使用網(wǎng)絡實時的傳遞文字消息、文件、語音與視頻交流.IM
在直播系統(tǒng)中的主要作用是實現(xiàn)觀眾與主播、觀眾與觀眾之間的文字互動.七牛云:七牛直播云是專為直播平臺打造的全球化直播流服務和一站式實現(xiàn)SDK端到端直播場景的企業(yè)級直播云服務平臺.
網(wǎng)易視頻云:基于專業(yè)的跨平臺視頻編解碼技術和大規(guī)模視頻內容分發(fā)網(wǎng)絡,提供穩(wěn)定流暢、低延時、高并發(fā)的實時音視頻服務,可將視頻直播無縫對接到自身App.
第三方SDK開發(fā)
: 對于一個初創(chuàng)團隊來講,自研直播不管在技術門檻、CDN、帶寬上都是有很大的門檻的,而且需要耗費大量的時間才能做出成品,不利于拉投資。
自研
:公司直播平臺大,從長遠看,自研可以節(jié)省成本,技術成面比直接用SDK可控多了。