1. 程式人生 > >基於公有雲平臺實現直播、點播及小視頻功能(二)

基於公有雲平臺實現直播、點播及小視頻功能(二)

騰訊 去除 使用 商業 png wowza 技術分享 傳感器 都是

呵呵,上一節不知道怎麽的就開始扯起了電視的發展,不過確實是勾起了我童年的回憶,這節我們正式進入正題,先說說直播。
直播這個詞看到以後,讓我們想到的是什麽?其實感覺也沒什麽,因為已經很普及,是否更多的是想到了直播帶來的利益鏈?
“某公司財務職員私自挪用公司資產打賞某主播金額高達數百萬!!!”是啊,好像更多的是這樣的字眼,那這個平臺是如何實現的呢?為什麽能有這麽大的能量?
直播包括流采集,流處理,編碼,推流,拉流,解碼,播放,這些步驟。
技術分享圖片
這個圖片基本概括了直播的全過程

一、流采集
流采集包括圖像流和音頻流

音頻采集
音頻數據既能與圖像結合組合成視頻數據,也能以純音頻的方式采集播放,後者在很多成熟的應用場景如在線電臺和語音電臺等起著非常重要的作用。音頻的采集過程主要通過設備將環境中的模擬信號采集成 PCM 編碼的原始數據,然後編碼壓縮成 MP3 等格式的數據分發出去。常見的音頻壓縮格式有:MP3,AAC,HE-AAC,Opus,FLAC,Vorbis (Ogg),Speex 和 AMR等。

音頻采集和編碼主要面臨的挑戰在於:延時敏感、卡頓敏感、噪聲消除(Denoise)、回聲消除(AEC)、靜音檢測(VAD)和各種混音算法等。

圖像采集
將圖像采集的圖片結果組合成一組連續播放的動畫,即構成視頻中可肉眼觀看的內容。圖像的采集過程主要由攝像頭等設備拍攝成 YUV 編碼的原始數據,然後經過編碼壓縮成 H.264 等格式的數據分發出去。常見的視頻封裝格式有:MP4、3GP、AVI、MKV、WMV、MPG、VOB、FLV、SWF、MOV、RMVB 和 WebM 等。
圖像由於其直觀感受最強並且體積也比較大,構成了一個視頻內容的主要部分。圖像采集和編碼面臨的主要挑戰在於:設備兼容性差、延時敏感、卡頓敏感以及各種對圖像的處理操作如美顏和水印等。

視頻采集的采集源主要有 攝像頭采集、屏幕錄制和從視頻文件推流。

二、流處理
對采集的視頻音頻做一些處理
流采集的過程中會采集到最原始的視頻和音頻文件,需要進行一些處理,例如說增加logo水印,增加時間戳,進行圖像美顏等操作。

三、編碼
一個原始的視頻數據采集到後容量非常的大,比如說一個時長10S的1080P的視頻大小在1G左右,如果未經過編碼壓縮的話傳輸會非常有壓力,並且也無法滿足實時性的要求,而進過H..264編碼後會將視頻壓縮到900K左右,10M的帶寬傳輸只需要700ms左右,可以滿足實時性的要求,所以從視頻采集傳感器采集來的原始視頻勢必要經過視頻編碼。
基本原理
為什麽巨大的原始視頻可以編碼成很小的視頻呢?這其中的技術是什麽呢?核心思想就是去除冗余信息:

1)空間冗余:圖像相鄰像素之間有較強的相關性
2)時間冗余:視頻序列的相鄰圖像之間內容相似
3)編碼冗余:不同像素值出現的概率不同
4)視覺冗余:人的視覺系統對某些細節不敏感
5)知識冗余:規律性的結構可由先驗知識和背景知識得到

編碼器的選擇
視頻編碼器經歷了數十年的發展,已經從開始的只支持幀內編碼演進到現如今的 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 協議。

四、推流
采集好的音視頻文件需要被推流至一臺或一個可以提供媒體服務的集群服務器上進行流分發,說的傳輸就必須要涉及到傳輸的協議:

推送協議主要有三種:

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中的視/音頻數據。一個單一的連接可以通過不同的通道傳輸多路網絡流。這些通道中的包都是按照固定大小的包傳輸的。

五、拉流
將音視頻推流至流媒體服務器後,就完成了直播的第一步,接下來就有一個發布的中心,所有人可以來這個發布的地址拉去視頻流,實際提供服務的產品有很多,
比較有名的有:
流媒體解決方案 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

六、CDN分發加速
這部分算是直播,點播技術能夠廣泛的傳播的重要因素

七、解碼播放
使用播放器可以將拉取到的數據流進行解碼並播放
PC端:VLC比較廣泛使用並且很好用的播放器
移動端:ijkplayer播放器

當然我說的每一個點都比較粗略,大概介紹一下實現原理,別的不多BB,直接開始使用公有雲平臺提供的服務,騰訊雲LVB和阿裏雲(ApsaraVideo Live)
實踐出真知,先從騰訊雲開始:
首先,我們需要有一個實名認證後的企業或個人賬戶,然後需要點擊申請開通直播服務(默認是沒有開通的)
技術分享圖片
等待審核,官方告知的時間是3-5個工作日,當然這個是可以通過提交工單等方式來催促加速開通的。
服務開通後我們就可以開始進入直播控制臺
技術分享圖片
詳細的內容就不做介紹了,只要實際操作都很直觀,直接切入正題,主要能夠提供直播服務的核心在“接入管理”,接入管理下拉後會有兩種接入方式:
1、直播碼接入;
2、頻道托管;
技術分享圖片
就像截圖中提示的一樣,直播碼接入屬於推薦哦,那就是官方想讓你用的版本,說白了這個直播碼的模式對於用戶來說定制化更高,可以更加靈活的供用戶使用接入到自己的直播平臺中,但是實際上還是推薦先使用頻道托管的模式,為啥?更直觀唄!!!
進入托管頻道開始
技術分享圖片
直播贈送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

基於公有雲平臺實現直播、點播及小視頻功能(二)