接上一篇:
呵呵,上一節不知道怎麼的就開始扯起了電視的發展,不過確實是勾起了我童年的回憶,這節咱們正式進入正題,先說說直播。
直播這個詞看到之後,讓咱們想到的是什麼?其實感受也沒什麼,由於已經很普及,是否更多的是想到了直播帶來的利益鏈?
「某公司財務職員私自挪用公司資產打賞某主播金額高達數百萬!!!」是啊,好像更多的是這樣的字眼,那這個平臺是如何實現的呢?爲何能有這麼大的能量?
直播包括流採集,流處理,編碼,推流,拉流,解碼,播放,這些步驟。
這個圖片基本歸納了直播的全過程算法
1、流採集
流採集包括圖像流和音頻流瀏覽器
音頻採集
音頻數據既能與圖像結合組合成視頻數據,也能以純音頻的方式採集播放,後者在不少成熟的應用場景如在線電臺和語音電臺等起着很是重要的做用。音頻的採集過程主要經過設備將環境中的模擬信號採集成 PCM 編碼的原始數據,而後編碼壓縮成 MP3 等格式的數據分發出去。常見的音頻壓縮格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。
音頻採集和編碼主要面臨的挑戰在於:延時敏感、卡頓敏感、噪聲消除(Denoise)、回聲消除(AEC)、靜音檢測(VAD)和各類混音算法等。服務器
圖像採集
將圖像採集的圖片結果組合成一組連續播放的動畫,即構成視頻中可肉眼觀看的內容。圖像的採集過程主要由攝像頭等設備拍攝成 YUV 編碼的原始數據,而後通過編碼壓縮成 H.264 等格式的數據分發出去。常見的視頻封裝格式有:MP四、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
圖像因爲其直觀感覺最強而且體積也比較大,構成了一個視頻內容的主要部分。圖像採集和編碼面臨的主要挑戰在於:設備兼容性差、延時敏感、卡頓敏感以及各類對圖像的處理操做如美顏和水印等。網絡
視頻採集的採集源主要有 攝像頭採集、屏幕錄製和從視頻文件推流。併發
2、流處理
對採集的視頻音頻作一些處理
流採集的過程當中會採集到最原始的視頻和音頻文件,須要進行一些處理,例如說增長logo水印,增長時間戳,進行圖像美顏等操做。框架
3、編碼
一個原始的視頻數據採集到後容量很是的大,好比說一個時長10S的1080P的視頻大小在1G左右,若是未通過編碼壓縮的話傳輸會很是有壓力,而且也沒法知足實時性的要求,而進過H..264編碼後會將視頻壓縮到900K左右,10M的帶寬傳輸只須要700ms左右,能夠知足實時性的要求,因此從視頻採集傳感器採集來的原始視頻勢必要通過視頻編碼。
基本原理
爲何巨大的原始視頻能夠編碼成很小的視頻呢?這其中的技術是什麼呢?核心思想就是去除冗餘信息:
1)空間冗餘:圖像相鄰像素之間有較強的相關性
2)時間冗餘:視頻序列的相鄰圖像之間內容類似
3)編碼冗餘:不一樣像素值出現的機率不一樣
4)視覺冗餘:人的視覺系統對某些細節不敏感
5)知識冗餘:規律性的結構可由先驗知識和背景知識獲得ide
編碼器的選擇
視頻編碼器經歷了數十年的發展,已經從開始的只支持幀內編碼演進到現現在的 H.265 和 VP9 爲表明的新一代編碼器,下面是一些常見的視頻編碼器:
1)H.264/AVC
2)HEVC/H.265
3)VP8
4)VP9
5)FFmpeg
注:音頻編碼器有Mp3, AAC等。工具
編碼完成後須要將編碼後的文件以一種標準進行封裝生成某種格式的媒體文件,下面是幾種常見的封裝格式:
1)AVI 格式(後綴爲 .avi)
2)DV-AVI 格式(後綴爲 .avi)
3)QuickTime File Format 格式(後綴爲 .mov)
4)MPEG 格式(文件後綴能夠是 .mpg .mpeg .mpe .dat .vob .asf .3gp .mp4等)
5)WMV 格式(後綴爲.wmv .asf)
6)Real Video 格式(後綴爲 .rm .rmvb)
7)Flash Video 格式(後綴爲 .flv)
8)Matroska 格式(後綴爲 .mkv)
9)MPEG2-TS 格式 (後綴爲 .ts)
目前,咱們在流媒體傳輸,尤爲是直播中主要採用的就是 FLV 和 MPEG2-TS 格式,分別用於 RTMP/HTTP-FLV 和 HLS 協議。測試
4、推流
採集好的音視頻文件須要被推流至一臺或一個能夠提供媒體服務的集羣服務器上進行流分發,說的傳輸就必需要涉及到傳輸的協議:動畫
推送協議主要有三種:
RTSP(Real Time Streaming Protocol):實時流傳送協議,是用來控制聲音或影像的多媒體串流協議, 由Real Networks和Netscape共同提出的;
RTMP(Real Time Messaging Protocol):實時消息傳送協議,是Adobe公司爲Flash播放器和服務器之間音頻、視頻和數據傳輸 開發的開放協議;
HLS(HTTP Live Streaming):是蘋果公司(Apple Inc.)實現的基於HTTP的流媒體傳輸協議;
RTMP協議基於 TCP,是一種設計用來進行實時數據通訊的網絡協議,主要用來在 flash/AIR 平臺和支持 RTMP 協議的流媒體/交互服務器之間進行音視頻和數據通訊。支持該協議的軟件包括 Adobe Media Server/Ultrant Media Server/red5 等。
它有三種變種:
RTMP工做在TCP之上的明文協議,使用端口1935;
RTMPT封裝在HTTP請求之中,可穿越防火牆;
RTMPS相似RTMPT,但使用的是HTTPS鏈接;
RTMP 是目前主流的流媒體傳輸協議,普遍用於直播領域,能夠說市面上絕大多數的直播產品都採用了這個協議。
RTMP協議就像一個用來裝數據包的容器,這些數據能夠是AMF格式的數據,也能夠是FLV中的視/音頻數據。一個單一的鏈接能夠經過不一樣的通道傳輸多路網絡流。這些通道中的包都是按照固定大小的包傳輸的。
5、拉流
將音視頻推流至流媒體服務器後,就完成了直播的第一步,接下來就有一個發佈的中心,全部人能夠來這個發佈的地址拉去視頻流,實際提供服務的產品有不少,
比較有名的有:
流媒體解決方案 Live555 (C++)
流媒體平臺框架 EasyDarwin (C++,國產精品)
實時流媒體播放服務器程序DarwinStreamingSrvr (C++)
Flash流媒體服務器 Red5 (Java)
流媒體服務器 Open Streaming Server (Java)
FMS流媒體服務器 (Adobe,收費的)
Wowza流媒體服務器(Java)
開源流媒體平臺FreeCast(Java)
Nginx+RTMP插件
其中Wowza也是收費的,若是你要用於商業用途的話須要購買官方的正版liences
,你能夠先經過官方申請一個測試爲期1個月的liences
6、CDN分發加速
這部分算是直播,點播技術可以普遍的傳播的重要因素
7、解碼播放
使用播放器能夠將拉取到的數據流進行解碼並播放
PC端:VLC比較普遍使用而且很好用的播放器
移動端:ijkplayer播放器
固然我說的每個點都比較粗略,大概介紹一下實現原理,別的很少BB,直接開始使用公有云平臺提供的服務,騰訊雲LVB和阿里雲(ApsaraVideo Live)
實踐出真知,先從騰訊雲開始:
首先,咱們須要有一個實名認證後的企業或我的帳戶,而後須要點擊申請開通直播服務(默認是沒有開通的)
等待審覈,官方告知的時間是3-5個工做日,固然這個是能夠經過提交工單等方式來催促加速開通的。
服務開通後咱們就能夠開始進入直播控制檯
詳細的內容就不作介紹了,只要實際操做都很直觀,直接切入正題,主要可以提供直播服務的核心在「接入管理」,接入管理下拉後會有兩種接入方式:
一、直播碼接入;
二、頻道託管;
就像截圖中提示的同樣,直播碼接入屬於推薦哦,那就是官方想讓你用的版本,說白了這個直播碼的模式對於用戶來講定製化更高,能夠更加靈活的供用戶使用接入到本身的直播平臺中,可是實際上仍是推薦先使用頻道託管的模式,爲啥?更直觀唄!!!
進入托管頻道開始
直播贈送5個免費推流頻道, 正在推流併發頻道數超過5個時(不包括未推流頻道),按照每個月併發實際推流頻道峯值數減去5個免費頻道收費。 超出部分收取60元/視頻/月的費用
點擊建立頻道
標有星號的項目都要填寫,基本也沒有什麼大的注意的地方,須要留意的是若是你的直播提供多碼率的播放的話,你須要將編碼部分的轉標清和轉高清勾選,這樣才能提供多碼率的播放地址,不然有隻有原始碼率的資源可供播放
還有水印部分,騰訊雲提供全局設置,全局設置中能夠自定義你的水印logo
OK,就這樣建好一個頻道,咱們進入頻道查看一下
設置開通完頻道後咱們會發現騰訊默認是採用RTMP協議來推流的,別問我爲何知道,看看生成的直播源設置一欄,有什麼有價值的部分嗎?固然,這裏面有價值的部分就是直播源設置這一欄,直播源設置中有地址
這個地址的構造有必定的規律,實際產品中,您不可能爲每個主播手工建立推流和播放 URL,而是要由您的服務器自行拼裝,只要符合騰訊雲標準規範的 URL 就能夠用來推流,以下是一條標準的推流 URL,它由三個部分組成:
防盜鏈簽名怎麼生成的呢?實際這個部分不是很關鍵,可是仍是說一下,防盜鏈簽名這部分是由直播頻道ID加過時時間戳MD5獲得的,過時時間戳是採用UNIX時間的形式,好比說:
頻道ID:10905947996256980784
過時時間戳:1531728131
防盜簽名:MD5(109059479962569807841531728131)=70d4526324ee4c97bd8e1c1238ad4338,生成32位小寫簽名
其餘的其實沒有什麼了,能夠直接推流測試下,那推流怎麼推呢?最簡單的方式直接使用開源的推流工具OBS,OBS是什麼?百度一下你就知道,具體推流工具的設置也很少作說明,須要說明的是獲得這個頻道的地址後如何將推流端的數據流推到騰訊雲?
點擊OBS的設置
彈出對應的設置窗口,感興趣的話能夠都點開看下會有什麼具體設置,咱們要作的只是點擊「流」,設置具體的推流地址
那用上面的那個地址爲例rtmp://11179.livepush.myqcloud.com/live/11179_db358fa730db11e892905cb9018cf0d4?bizid=11179
流類型選擇自定義流媒體服務器,URL填live前面的部分
rtmp://11179.livepush.myqcloud.com/live/
流名稱填餘下部分
11179_db358fa730db11e892905cb9018cf0d4?bizid=11179
流名稱默認須要隱藏,也能夠顯示。
而後點擊保存,這樣推流的地址已經配置好了。
接下來咱們要作的就是爲直播找一個直播的源頭,在來源一欄中點擊「+」號彈出如下菜單
直播的來源不少,咱們不所有說明了,這裏就說最經常使用的兩個,一個是媒體源,一個是視頻捕獲設備,媒體源顧名思義就是添加一個本地的資源傳上去讓他播放唄,視頻捕獲設備就是調用你的攝像頭拍你唄。
話說源頭也有了,如何播放呢?早就都準備好了
點擊分享URL,而後直接把URL甩在瀏覽器上就OK了!!!
固然這樣看起來有些突兀,由於只是一個直播窗口,可是實際狀況窗口是在開發過程當中嵌套在網頁中的,相似這樣:
這樣就實現了直播的功能,實際狀況下,能夠把騰訊這邊提供的這個服務當作是一個黑盒,開發的過程當中只須要將其嵌套進去就能夠了,一樣也支持着移動端的開發,以及視頻加密這些小功能。
既然頻道託管模式已經說了這麼多,那直播碼接入方式就不須要多說了,照着這個來就能夠了,沒有太大的區別。
附一個騰訊的計費說明
https://cloud.tencent.com/document/product/267/2818