天天看點

一個完整的直播App功能分析

轉自:http://www.itwendao.com/article/detail/23187.html

一個完整的App直播功能分析

1.一個完整直播app功能

1、聊天

私聊、聊天室、點亮、推送、黑名單等;

2、禮物

普通禮物、豪華禮物、紅包、排行榜、第三方充值、内購、禮物動态更新、提現等;

3、直播清單

關注、熱門、最新、分類直播使用者清單等;

4、自己直播

錄制、推流、解碼、播放、美顔、心跳、背景切換、主播對管理者操作、管理者對使用者等;

5、房間邏輯

建立房間、進入房間、退出房間、關閉房間、切換房間、房間管理者設定、房間使用者清單等;

6、使用者邏輯

普通登陸、第三方登陸、注冊、搜尋、修改個人資訊、關注清單、粉絲清單、忘記密碼、檢視個人資訊、收入榜、關注和取關、檢索等;

7、觀看直播

聊天資訊、滾屏彈幕、禮物顯示、加載界面等;

8、統計

APP業務統計、第三方統計等;

9、超管

禁播、隐藏、稽核等;

直播效果圖

2.一個完整直播app原理

直播原理:把主播錄制的視訊,推送到伺服器,在由伺服器分發給觀衆觀看。

直播環節:推流端(采集、美顔處理、編碼、推流)、服務端處理(轉碼、錄制、截圖、鑒黃)、播放器(拉流、解碼、渲染)、互動系統(聊天室、禮物系統、贊)

3.一個完整直播app實作流程

1.采集、2.濾鏡處理、3.編碼、4.推流、5.CDN分發、6.拉流、7.解碼、8.播放、9.聊天互動

直播流程.png

4.一個完整直播app架構

直播架構.png

5.一個完整直播app技術點

WeChat_1472043345.jpeg

三、了解流媒體(直播需要用到流媒體)

流媒體開發:網絡層(socket或st)負責傳輸,協定層(rtmp或hls)負責網絡打包,封裝層(flv、ts)負責編解碼資料的封裝,編碼層(h.264和aac)負責圖像,音頻壓縮。

幀:每幀代表一幅靜止的圖像

GOP:(Group of Pictures)畫面組,一個GOP就是一組連續的畫面,每個畫面都是一幀,一個GOP就是很多幀的集合

直播的資料,其實是一組圖檔,包括I幀、P幀、B幀,當使用者第一次觀看的時候,會尋找I幀,而播放器會到伺服器尋找到最近的I幀回報給使用者。是以,GOP Cache增加了端到端延遲,因為它必須要拿到最近的I幀

GOP Cache的長度越長,畫面品質越好

碼率:圖檔進行壓縮後每秒顯示的資料量。

幀率:每秒顯示的圖檔數。影響畫面流暢度,與畫面流暢度成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。

由于人類眼睛的特殊生理結構,如果所看畫面之幀率高于16的時候,就會認為是連貫的,此現象稱之為視覺暫留。并且當幀速達到一定數值後,再增長的話,人眼也不容易察覺到有明顯的流暢度提升了。

分辨率:(矩形)圖檔的長度和寬度,即圖檔的尺寸

壓縮前的每秒資料量:幀率X分辨率(機關應該是若幹個位元組)

壓縮比:壓縮前的每秒資料量/碼率 (對于同一個視訊源并采用同一種視訊編碼算法,則:壓縮比越高,畫面品質越差。) 

視訊檔案格式:檔案的字尾,比如.wmv,.mov,.mp4,.mp3,.avi,

主要用處,根據檔案格式,系統會自動判斷用什麼軟體打開,

注意: 随意修改檔案格式,對檔案的本身不會造成太大的影響,比如把avi改成mp4,檔案還是avi.

視訊封裝格式:一種儲存視訊資訊的容器,流式封裝可以有TS、FLV等,索引式的封裝有MP4,MOV,AVI等,

主要作用:一個視訊檔案往往會包含圖像和音頻,還有一些配置資訊(如圖像和音頻的關聯,如何解碼它們等):這些内容需要按照一定的規則組織、封裝起來.

注意:會發現封裝格式跟檔案格式一樣,因為一般視訊檔案格式的字尾名即采用相應的視訊封裝格式的名稱,是以視訊檔案格式就是視訊封裝格式。

視訊封裝格式和視訊壓縮編碼标準:就好像項目工程和程式設計語言,封裝格式就是一個項目的工程,視訊編碼方式就是程式設計語言,一個項目工程可以用不同語言開發。

四、直播基礎知識介紹:

1.采集視訊、音頻

* 1.1 采集視訊、音頻編碼架構 *

AVFoundation:AVFoundation是用來播放和建立實時的視聽媒體資料的架構,同時提供Objective-C接口來操作這些視聽資料,比如編輯,旋轉,重編碼

* 1.2 視訊、音頻硬體裝置 *

CCD:圖像傳感器: 用于圖像采集和處理的過程,把圖像轉換成電信号。

拾音器:聲音傳感器: 用于聲音采集和處理的過程,把聲音轉換成電信号。

音頻采樣資料:一般都是PCM格式

視訊采樣資料: 一般都是YUV,或RGB格式,采集到的原始音視訊的體積是非常大的,需要經過壓縮技術處理來提高傳輸效率

2.視訊處理(美顔,水印)

視訊處理原理:因為視訊最終也是通過GPU,一幀一幀渲染到螢幕上的,是以我們可以利用OpenGL ES,對視訊幀進行各種加工,進而視訊各種不同的效果,就好像一個水龍頭流出的水,經過若幹節管道,然後流向不同的目标

現在的各種美顔和視訊添加特效的app都是利用GPUImage這個架構實作的,.

* 視訊處理架構 *

GPUImage : GPUImage是一個基于OpenGL ES的一個強大的圖像/視訊處理架構,封裝好了各種濾鏡同時也可以編寫自定義的濾鏡,其本身内置了多達120多種常見的濾鏡效果。

OpenGL:OpenGL(全寫Open Graphics Library)是個定義了一個跨程式設計語言、跨平台的程式設計接口的規格,它用于三維圖象(二維的亦可)。OpenGL是個專業的圖形程式接口,是一個功能強大,調用友善的底層圖形庫。

OpenGL ES:OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式裝置而設計。

3.視訊編碼解碼

* 3.1 視訊編碼架構 *

FFmpeg:是一個跨平台的開源視訊架構,能實作如視訊編碼,解碼,轉碼,串流,播放等豐富的功能。其支援的視訊格式以及播放協定非常豐富,幾乎包含了所有音視訊編解碼、封裝格式以及播放協定。

-Libswresample:可以對音頻進行重采樣,rematrixing 以及轉換采樣格式等操 作。

-Libavcodec:提供了一個通用的編解碼架構,包含了許多視訊,音頻,字幕流 等編碼/解碼器。

-Libavformat:用于對視訊進行封裝/解封裝。

-Libavutil:包含一些共用的函數,如随機數生成,資料結構,數學運算等。

-Libpostproc:用于進行視訊的一些後期處理。

-Libswscale:用于視訊圖像縮放,顔色空間轉換等。

-Libavfilter:提供濾鏡功能。

X264:把視訊原資料YUV編碼壓縮成H.264格式

VideoToolbox:蘋果自帶的視訊硬解碼和寫死API,但是在iOS8之後才開放。

AudioToolbox:蘋果自帶的音頻硬解碼和寫死API

* 3.2 視訊編碼技術 *

視訊壓縮編碼标準:對視訊進行壓縮(視訊編碼)或者解壓縮(視訊解碼)的編碼技術,比如MPEG,H.264,這些視訊編碼技術是壓縮編碼視訊的

主要作用:是将視訊像素資料壓縮成為視訊碼流,進而降低視訊的資料量。如果視訊不經過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。

注意:最影響視訊品質的是其視訊編碼資料和音頻編碼資料,跟封裝格式沒有多大關系

MPEG:一種視訊壓縮方式,它采用了幀間壓縮,僅存儲連續幀之間有差别的地方 ,進而達到較大的壓縮比

H.264/AVC:一種視訊壓縮方式,采用事先預測和與MPEG中的P-B幀一樣的幀預測方法壓縮,它可以根據需要産生适合網絡情況傳輸的視訊流,還有更高的壓縮比,有更好的圖象品質

注意1:如果是從單個畫面清晰度比較,MPEG4有優勢;從動作連貫性上的清晰度,H.264有優勢

注意2:由于264的算法更加複雜,程式實作煩瑣,運作它需要更多的處理器和記憶體資源。是以,運作264對系統要求是比較高的。

注意3:由于264的實作更加靈活,它把一些實作留給了廠商自己去實作,雖然這樣給實作帶來了很多好處,但是不同産品之間互通成了很大的問題,造成了通過A公司的編碼器編出的資料,必須通過A公司的解碼器去解這樣尴尬的事情

H.265/HEVC:一種視訊壓縮方式,基于H.264,保留原來的某些技術,同時對一些相關的技術加以改進,以改善碼流、編碼品質、延時和算法複雜度之間的關系,達到最優化設定。

H.265 是一種更為高效的編碼标準,能夠在同等畫質效果下将内容的體積壓縮得更小,傳輸時更快更省帶寬

I幀:(關鍵幀)保留一副完整的畫面,解碼時隻需要本幀資料就可以完成(因為包含完整畫面)

P幀:(差别幀)保留這一幀跟之前幀的差别,解碼時需要用之前緩存的畫面疊加上本幀定義的差别,生成最終畫面。(P幀沒有完整畫面資料,隻有與前一幀的畫面差别的資料)

B幀:(雙向差别幀)保留的是本幀與前後幀的差别,解碼B幀,不僅要取得之前的緩存畫面,還要解碼之後的畫面,通過前後畫面的與本幀資料的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累

幀内(Intraframe)壓縮:當壓縮一幀圖像時,僅考慮本幀的資料而不考慮相鄰幀之間的備援資訊,幀内一般采用有損壓縮算法

幀間(Interframe)壓縮:時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的資料進行壓縮。幀間壓縮一般是無損的

muxing(合成):将視訊流、音頻流甚至是字幕流封裝到一個檔案中(容器格式(FLV,TS)),作為一個信号進行傳輸。

* 3.3 音頻編碼技術 *

AAC,mp3:這些屬于音頻編碼技術,壓縮音頻用

* 3.4碼率控制 *

多碼率:觀衆所處的網絡情況是非常複雜的,有可能是WiFi,有可能4G、3G、甚至2G,那麼怎麼滿足多方需求呢?多搞幾條線路,根據目前網絡環境自定義碼率。

列如:常常看見視訊播放軟體中的1024,720,高清,标清,流暢等,指的就是各種碼率。

* 3.5 視訊封裝格式 *

TS : 一種流媒體封裝格式,流媒體封裝有一個好處,就是不需要加載索引再播放,大大減少了首次載入的延遲,如果片子比較長,mp4檔案的索引相當大,影響使用者體驗

為什麼要用TS:這是因為兩個TS片段可以無縫拼接,播放器能連續播放

FLV: 一種流媒體封裝格式,由于它形成的檔案極小、加載速度極快,使得網絡觀看視訊檔案成為可能,是以FLV格式成為了當今主流視訊格式

4.推流

* 4.1 資料傳輸架構 *

librtmp:用來傳輸RTMP協定格式的資料

  • 4.2 流媒體資料傳輸協定 *

RTMP:實時消息傳輸協定,Adobe Systems公司為Flash播放器和伺服器之間音頻、視訊和資料傳輸開發的開放協定,因為是開放協定是以都可以使用了。

RTMP協定用于對象、視訊、音頻的傳輸。

這個協定建立在TCP協定或者輪詢HTTP協定之上。

RTMP協定就像一個用來裝資料包的容器,這些資料可以是FLV中的視音頻資料。一個單一的連接配接可以通過不同的通道傳輸多路網絡流,這些通道中的包都是按照固定大小的包傳輸的

chunk:消息包

5.流媒體伺服器

* 5.1常用伺服器 *

SRS:一款國人開發的優秀開源流媒體伺服器系統

BMS:也是一款流媒體伺服器系統,但不開源,是SRS的商業版,比SRS功能更多

nginx:免費開源web伺服器,常用來配置流媒體伺服器。

* 5.2資料分發 *

CDN:(Content Delivery Network),即内容分發網絡,将網站的内容釋出到最接近使用者的網絡”邊緣”,使使用者可以就近取得所需的内容,解決 Internet網絡擁擠的狀況,提高使用者通路網站的響應速度.

CDN:代理伺服器,相當于一個中介。

CDN工作原理:比如請求流媒體資料

1.上傳流媒體資料到伺服器(源站)

2.源站存儲流媒體資料

3.用戶端播放流媒體,向CDN請求編碼後的流媒體資料

4.CDN的伺服器響應請求,若節點上沒有該流媒體資料存在,則向源站繼續請求流媒體資料;若節點上已經緩存了該視訊檔案,則跳到第6步。

5.源站響應CDN的請求,将流媒體分發到相應的CDN節點上

6.CDN将流媒體資料發送到用戶端

回源:當有使用者通路某一個URL的時候,如果被解析到的那個CDN節點沒有緩存響應的内容,或者是緩存已經到期,就會回源站去擷取搜尋。如果沒有人通路,那麼CDN節點不會主動去源站拿.

帶寬:在固定的時間可傳輸的資料總量,

比如64位、800MHz的前端總線,它的資料傳輸率就等于64bit×800MHz÷8(Byte)=6.4GB/s

負載均衡: 由多台伺服器以對稱的方式組成一個伺服器集合,每台伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助.

通過某種負載分擔技術,将外部發送來的請求均勻配置設定到對稱結構中的某一台伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。

均衡負載能夠平均配置設定客戶請求到伺服器列陣,籍此提供快速擷取重要資料,解決大量并發通路服務問題。

這種群集技術可以用最少的投資獲得接近于大型主機的性能。

QoS(帶寬管理):限制每一個組群的帶寬,讓有限的帶寬發揮最大的效用

6.拉流

直播協定選擇:

即時性要求較高或有互動需求的可以采用RTMP,RTSP

對于有回放或跨平台需求的,推薦使用HLS

直播協定對比 :

直播協定對比.png

HLS:由Apple公司定義的用于實時流傳輸的協定,HLS基于HTTP協定實作,傳輸内容包括兩部分,一是M3U8描述檔案,二是TS媒體檔案。可實作流媒體的直播和點播,主要應用在iOS系統

HLS是以點播的技術方式來實作直播

HLS是自适應碼率流播,用戶端會根據網絡狀況自動選擇不同碼率的視訊流,條件允許的情況下使用高碼率,網絡繁忙的時候使用低碼率,并且自動在二者間随意切

換。這對移動裝置網絡狀況不穩定的情況下保障流暢播放非常有幫助。

實作方法是伺服器端提供多碼率視訊流,并且在清單檔案中注明,播放器根據播放進度和下載下傳速度自動調整。

HLS與RTMP對比:HLS主要是延時比較大,RTMP主要優勢在于延時低

HLS協定的小切片方式會生成大量的檔案,存儲或處理這些檔案會造成大量資源浪費

相比使用RTSP協定的好處在于,一旦切分完成,之後的分發過程完全不需要額外使用任何專門軟體,普通的網絡伺服器即可,大大降低了CDN邊緣伺服器的配置要求,可以使用任何現成的CDN,而一般伺服器很少支援RTSP。

HTTP-FLV:基于HTTP協定流式的傳輸媒體内容。

相對于RTMP,HTTP更簡單和廣為人知,内容延遲同樣可以做到1~3秒,打開速度更快,因為HTTP本身沒有複雜的狀态互動。是以從延遲角度來看,HTTP-FLV要優于RTMP。

RTSP:實時流傳輸協定,定義了一對多應用程式如何有效地通過IP網絡傳送多媒體資料.

RTP:實時傳輸協定,RTP是建立在UDP協定上的,常與RTCP一起使用,其本身并沒有提供按時發送機制或其它服務品質(QoS)保證,它依賴于低層服務去實作這一過程。

RTCP:RTP的配套協定,主要功能是為RTP所提供的服務品質(QoS)提供回報,收集相關媒體連接配接的統計資訊,例如傳輸位元組數,傳輸分組數,丢失分組數,單向和雙向網絡延遲等等。

7.解碼

* 7.1 解封裝 *

demuxing(分離):從視訊流、音頻流,字幕流合成的檔案(容器格式(FLV,TS))中, 分解出視訊、音頻或字幕,各自進行解碼。

* 7.2 音頻編碼架構 *

fdk_aac:音頻編碼解碼架構,PCM音頻資料和AAC音頻資料互轉

* 7.3 解碼介紹 *

硬解碼:用GPU來解碼,減少CPU運算

 優點:播放流暢、低功耗,解碼速度快,

   * 缺點:相容不好

軟解碼:用CPU來解碼

優點:相容好

   * 缺點:加大CPU負擔,耗電增加、沒有硬解碼流暢,解碼速度相對慢

8.播放

ijkplayer:一個基于FFmpeg的開源Android/iOS視訊播放器

API易于內建;

編譯配置可裁剪,友善控制安裝包大小;

支援硬體加速解碼,更加省電

簡單易用,指定拉流URL,自動解碼播放.

9.聊天互動

IM:(InstantMessaging)即時通訊:是一個實時通信系統,允許兩人或多人使用網絡實時的傳遞文字消息、檔案、語音與視訊交流.

IM在直播系統中的主要作用是實作觀衆與主播、觀衆與觀衆之間的文字互動.

* 第三方SDK *

騰訊雲:騰訊提供的即時通訊SDK,可作為直播的聊天室

融雲:一個比較常用的即時通訊SDK,可作為直播的聊天室

繼續閱讀