騰訊課堂點播上雲客戶端實踐總結
導語 | 自從2018年企鵝輔導直播、點播和騰訊課堂直播上雲以後,19年上半年騰訊課堂點播也開始自研上雲。本文是對騰訊課堂點播上雲客戶端方案的整理與總結,希望能與各位同行一起交流。
一、課堂騰訊雲點播 HLS 播放
1. HLS 淺析
(1) HLS 協議
點播業務目前用的是 HLS 協議。HLS協議全稱是 HTTP Live Streaming,它是一個由蘋果提出的基於HTTP的流媒體網路傳輸協議。HLS協議規定:
-
視訊的封裝格式是TS;
-
視訊編碼格式為H264,音訊編碼格式為MP3、AAC或者AC-3;
- 除了TS視訊檔案本身,還定義了用來控制播放的m3u8檔案。
HLS的工作流程如下圖(來源蘋果官網)所示
-
Server
Server獲取媒體輸入流,Media編碼 MPEG-4(H.264 video 和 AAC audio),然後打包到 MPEG-2 (MPEG-2 transport stream)的傳輸流中,傳輸流會經過Stream segmenter,MPEG-2傳輸流會被分散為小片段然後儲存為一個或多個系列的 .ts 格式的媒體檔案。 -
Distribution
Stream segmenter會建立一個索引檔案,通常會包含這些媒體檔案的一個列表,也能包含元資料,一般都是一個.m3u8的列表,列表元素會關聯一個 URL 用於客戶端訪問,然後按序去請求這些 URL。 -
Client
Client主要接受Client客戶端請求並提供相關聯的資源給客戶端。
(2)HLS 的 index 檔案
index 檔案就是 m3u8 文字檔案,如下圖(來源蘋果官網)所示。
客戶端播放HLS視訊流的邏輯是先下載一級 Index file,它裡面記錄了二級索引檔案(Alternate-A、Alternate-B、Alternate-C)的地址,然後客戶端再去下載二級索引檔案,二級索引檔案中記錄了 TS、dk 的下載地址,這樣客戶端就可以按順序下載 TS、dk 檔案並連續播放。以企鵝輔導為例,一級 index(master_playlist.m3u8)檔案如下圖所示:
-
#EXTM3U ---表明該檔案是一個m3u8播放列表檔案,必須在第一行給出;
-
#EXT-X-VERSION:3 ---播放列表檔案的版本,現在主流版本是3;
-
#EXT-X-STREAM-INF ---不同位元速率的資料流 ;
-
PROGRAM-ID=0 ---唯一標記;
-
BANDWIDTH=92166 ---這個值是十進位制整數代表每秒鐘的位元率,這個值必須是整個播放列表中位元速率的峰值;
- RESOLUTION=384x288 ---視訊流的解析度。
二級 index(對應任意一個清晰度)檔案如下圖所示:
- #EXT-X-KEY ---媒體檔案有可能要被加密,該標籤描述瞭如何解密媒體檔案;
- METHOD ---包括NONE、AES-128、和SAMPLE-AES。如果該值是NONE或播放列表沒有定義該標籤,表示媒體段沒有被加密。如果設定了NONE,則其他屬性不會出現。其中AES-128表示媒體是由AES-128標準構造的的128bit的 key,和密碼塊連結(CBC)和PKCS7加密組成的,URI 引數必須出現在METHOD後面;
- URI ---描述瞭如何獲取key檔案;
- IV ---IV可以不存在,如果沒有IV則使用序列號作為IV進行編解碼,將序列號的高位賦到16位元組的buffer中,左邊補0,如果有IV,則將該值作為16位元組的16進位制數;
- #EXT-X-MEDIA-SEQUENCE ---m3u8播放列表中第一個出現的媒體段的序列號;
- #EXT-X-TARGETDURATION ---該標籤描述了媒體段的最大時長,EXTINF後面的實際媒體段時長不能超過這個標籤描述的值,否則會引起錯誤;
-
#EXTINF ---該標籤描述了媒體段的時長,在3.0版本後時長可以是浮點數,否則必須是整數。
2. 播放器本地代理
(1) 播放器直連Server
以企鵝輔導為例,播放器直連遠端Server的播放流程如下圖所示:
該流程存在一些缺點,比如:使用者播放視訊的時候可能等待的時間較長,造成流量的浪費,無法做快取、預載入等優化策略等。
(2) 通過本地代理播放
基本流程如下圖所示:
企鵝輔導詳細流程如下圖所示:
具體流程可以概括為:
-
啟動本地代理伺服器(一期採用mongoose);
-
視訊源地址傳給本地代理伺服器;
-
將視訊源地址轉換成本地代理伺服器(127.0.0.1)的地址作為播放器的視訊源地址;
-
播放器向本地代理伺服器傳送請求;
-
本地代理伺服器擷取這個請求,再根據解析出來請求的資訊向遠端伺服器發起請求;
-
本地代理伺服器開始接受資料,寫入檔案並將檔案資料再返回到播放器;
-
播放器接收到這些資料之後播放。
目前是使用mongoose(https://github.com/cesanta/mongoose)來實現本地Http Server,在這裡簡單介紹一下mongoose。
mg_mgr:用於管理連線、事件等的 Manager ;mg_connection:單個連線,儲存了連線資訊。
主要用法步驟:
- 呼叫mg_mgr_init進行初始化;
- 呼叫mg_bind,第2個引數為需要監聽的埠號,第3個引數為處理請求的handler;
- 呼叫mg_set_protocol_http_websocket將上一步返回的mg_connection與內建的http handler繫結。這樣我們的handler才能收到http事件;
-
通過一直呼叫mg_mgr_poll接收請求。
(3) Cache功能
使用本地代理一個重要作用就是Cache。
-
首先快取m3u8檔案內容;
-
當播放器請求第1個ts分片,非同步請求下一個ts分片並快取資料;
- 當播放器請求分片data時,記憶體有就記憶體返回,記憶體沒有就向遠端Server請求。
快取淘汰:假定使用者經常看的視訊不能優先淘汰,那麼用 LFU 淘汰策略即可。每個快取塊設定一個count,快取命中一次就 count++,觸發淘汰的時候,把 count 最小的先淘汰。流量控制:例如使用者只看了視訊前面一點,就暫停了,那麼後面的視訊不再下載等,具體細節後續文章將會詳細說明。seek:播放視訊的時候,使用者會拖動進度條進行seek,與 mp4 檔案不同,對於 hls 檔案 ffplay 會根據 seek 的 position,向本地伺服器請求 seek 的 position 所在的 ts 分片。
3. 騰訊課堂雲點播線上播放時序圖解析
如上圖所示:
-
第一步通過業務 get_token 協議拿到防盜鏈需要的Key。這裡需要注意的是防盜鏈的Key順序一定要按照騰訊雲文件中的順序,帶KEY防盜鏈的視訊播放地址的校驗工具;
-
第二步通過騰訊雲 getplayinfo 協議拿到播放的連結,這裡的連結 master和 transcodelist 都會返回;
-
第三步在請求的 URL 中拼接 voddrm.token 引數,用於鑑權;
- 第四步將請求的 URL 透傳給教育自研的播放器 ARMPlayer,ARMPlayer會啟動本地代理,請求資料/解碼/渲染。課堂採用的是HLS加密 [1],所以播放的時候還需要通過DK(金鑰)進行TS解密。
4. 課堂騰訊雲點播本地播放時序圖解析
如上圖所示:
-
第一步啟動本地代理,通過上層透傳的本地儲存的URL,讀取DB中的指定清晰度的 m3u8 連結和指定清晰度的 m3u8 的內容;
-
第二步改寫 m3u8 連結和 DK/TS 的域名為:127.0.0.1;
-
第三步請求本地 DK 和 TS 資料;
- 第四步解密/解封裝/渲染。
二、課堂騰訊雲點播優化
1. 首幀優化
首幀的主要耗時點有:
-
master.m3u8 透傳給FFmpeg,FFmpeg 會序列拉取3個清晰度的m3u8及第1個TS分片;
-
DNS解析耗時高;
-
每個清晰度.m3u8大小是400kb左右,拉取慢;
- DK和TS每次都需要拉取。
點播首幀優化前請求流程
這裡面可能會涉及到一些問題,下面給出它們的解決方案。
問題1:master.m3u8透傳給FFmpeg,FFmpeg會序列拉取3個清晰度的m3u8及第1個TS分片。
指定清晰度.m3u8 解決方案:
- getplayinfo協議直接獲取指定清晰度m3u8,減少master.m3u8 ->清晰度.m3u8的網路請求;
- 播放器從master.m3u8改為指定清晰度.m3u8透傳給FFmpeg,減少avformat_find_stream_info序列拉取3個清晰度和第1個TS分片的耗時。
問題2:DNS解析耗時高。
DNS快取 解決方案:
- 增加DNS結果快取模組,快取“{域名: IP}”;
-
視訊播放時,直接查表,取出域名對應的IP地址。
問題3:每個清晰度.m3u8大小是400kb左右,拉取慢
解決方案:
- 預載入;
- 預載入策略
預載入學生報名直播課結束1周內的m3u8資料和指定位置的TS、DK。
問題4:DK和TS每次都需要拉取
本地代理快取 解決方案:播放器設計了一個本地代理層,播放器不直連遠端server,而是通過本地代理層發出請求,通過本地代理層實現快取和讀取本地資源進行播放。
2. 播放成功率優化
對於播放成功率,最主要是要完善監控系統以及對出現的問題各個擊破,目前遇到的主要問題和解決方式如下:
主要問題和解決方式1
主要問題和解決方式2
3. 播放體驗優化
-
ffplay音視訊同步;
- 企鵝輔導錄播多路視訊流精確對齊。
精確Seek流程
4. 下載優化
-
下載成功率
因為教育自研的播放器下載和播放底層庫共用,所以除了播放出現的類似問題,下載方面我們還針對儲存、寫磁碟、安全性做了優化,已下載視訊採取DB分級對映快取。 -
下載速度
因為HLS是由無數個TS和DK構成,如果是單執行緒下載,每次請求一個TS和DK地址都將重新建立連線,所以這裡我們採用的是多執行緒以及播放快取複用邏輯。
5. 緩衝優化
這裡存在兩個問題,下面來做出解決方案。
問題1:舊播放器在讀資料 -> 解封裝 -> 解碼 -> 渲染鏈路上均出現過因為抖動而出現的緩衝。
緩衝區 解決方案:
-
幀緩衝區,抵抗網路抖動和解碼抖動;
- 顯示緩衝區,抵抗渲染抖動。
問題2:舊播放器是順序儲存同時沒有非同步請求後面的TS分片和DK。
多執行緒和儲存 解決方案:
-
順序儲存和Seek之後的非順序儲存;
- 多執行緒非同步請求。
6. 安全性優化
-
防盜鏈,騰訊雲防盜鏈主要有2種形式Referer防盜鏈和Key防盜鏈,目前課堂採用的是Key防盜鏈,騰訊雲防盜鏈[2];
-
HLS加密;
-
水印。
三、課堂騰訊雲點播踩過的坑
因為騰訊課堂不僅是新生成或上傳的視訊要上雲,同時對於之前存量的幾百萬MP4視訊要重新轉碼上傳到雲上,這個過程中容易踩到不少坑。這裡提供一些常見的問題以及解決方案。
1. 轉碼出的視訊清晰度不全
這裡主要有2個原因:機構上傳的視訊清晰度較低,低轉高不一定能轉碼出來,其次1080p不一定能轉成功。
解決方案:
-
後臺重新轉碼;
- 客戶端健壯性,對於清晰度缺少的視訊播放和下載採用降級策略,降級到最近的清晰度最清晰的視訊。
2. 獲取騰訊雲播放連結是通過getplayinfo介面
回包中包括 master.m3u8 和 transcodelist 兩個資訊,出現 master.m3u8 包含的清晰度個數和 transcodelist 清晰度個數不一致。
解決方案:後臺重新轉碼。
3. 播放提前結束或seek不準確
HLS標準中的EXTINF 標誌的切片時間總和和TS分片實際的時間總和不一致,導致播放提前結束和Seek不準確。
解決方案:後臺重新轉碼
4. 錄播視訊經過騰訊雲轉碼出現拉伸
機構上傳的原視訊不是標準的720,騰訊雲重新轉碼會出現拉伸。
解決方案:後臺重新轉碼。
5. 播放一直載入中
因為存量視訊從原來的MP4視訊切到HLS,偶現從後臺拉到的使用者上一次MP4播放進度同步到HLS,超過了HLS視訊總時長, 播放一直loading
解決方案:客戶端容錯, 超過視訊總時長將 Position 置為0。除了上面視訊本身可能會出現的坑,還有客戶端灰度期間相容兩種視訊源同時存在切換、Next學位和普通課程、回放分段視訊切換等也容易踩坑。目前課堂建立了完善的監控,第一時間發現解決問題。
從輔導到課堂,直播回放全量上雲,各項資料和使用者體驗都有了很大的提升,歡迎大家一起參與騰訊課堂點播上雲,一起為教育點播保駕護航!
參考資料:
[1] HLS 加密:
https://cloud.tencent.com/document/product/266/9638
[2] 騰訊雲防盜鏈:
https://cloud.tencent.com/document/product/266/14047
歡迎關注「雲加社群」,騰訊線上教育部上雲實踐系列文章將會陸續上線。
相關推薦
騰訊課堂點播上雲客戶端實踐總結
導語 | 自從2018年企鵝輔導直播、點播和騰訊課堂直播上雲以後,19年上半年騰訊課堂點播也開始自研上雲。本文是對騰訊課堂點播上雲客戶端方案的整理與總結,希望能與各位同行一起交流。 一、課堂騰訊雲點播 HLS 播放 1. HLS 淺析 (1) HLS 協議 點播業務目前用的是 HLS
2018騰訊模擬考試,移動客戶端開發崗
剛模擬完,15個不定項和一個程式設計,記得幾個,寫下來。 1.執行緒程序同步進位制有哪些 2. sizeof相關問題,不定項選擇裡考了很多sizeof的問題,包括對指標的,對結構體,32位和64位下的。還有char指標陣列和char陣列儲存位置,堆還是棧,是
【騰訊優測】騰訊優測是備受客戶信賴的移動雲測試平臺,為應用、遊戲,H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不僅在線上平臺提供「全面相容測試」、「原始碼缺陷分析」、「遠端真機租用」等多種質量檢測工具
騰訊優測 騰訊優測是備受客戶信賴的移動雲測試平臺,為應用、遊戲,H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不僅在線上平臺提供「全面相容測試」、「原始碼缺陷分析」、「遠端真機租用」等多種質量檢測工具...
2017年騰訊移動客戶端面試總結-失敗經驗
想不到第一次的CSDN就交給了這次面試經驗總結,在正式參加面試之前,我也看了很多大牛們發表的面試經驗總結,雖然我不是大牛,但是我希望後來的人也能夠看到我的面試足跡,對他們面試BAT有些許的幫助,就好。 首先先放上自己的面試結果:終止於第一輪面試,雖然走
教你爬取騰訊課堂、網易雲課堂、mooc等所有課程資訊
本文的所有程式碼都在GitHub上託管,想要程式碼的同學請點選這裡
騰訊課堂1:使用Jmeter內置的錄制功能進行錄制
bsp family logs -1 figure mil 宋體 報錯 conf 1、設置http代理服務器 打開火狐——點擊選項——高級——網絡——設置 設置完成點擊確定 2、查看端口是否被占用的命令 netstat -ano 3、排除模式 .*\.gif .*
騰訊課堂的物理實驗(2017計蒜客初賽第三場)
text ram amp tex 方向 top names rip des A題 在騰訊課堂的物理課上,進行了一個有趣的物理實驗。 在一個長度為 LL 米的光滑軌道上,小車 A 在 00 時刻以 1\mathrm{m/s}1m/s 的速度從左端出發向右運動,小車 B 在
騰訊課堂老師qq號碼轉換成 teacherid
col style eache log pre code spa 轉換 轉換成 result = 215696775^858006833 if(result<0){ result=4294967296+result; } alert(result); 騰訊課堂老師
年前唯品會、年後美麗說,京東與騰訊如何打劫馬雲?
人民網 不難 自己 品質 top 這不 隱藏 離開 購物 2018年1月4日,京東與社會化導購和電商平臺美麗聯合集團共同宣布,將成立一家全新的合資公司。合資公司將專註於運營微信社交生態中的電商平臺,為消費者提供更豐富的商品選擇,探索並引領社交電商領域的模式創新。而在不到一個
JavaSE環境下的shiro(源自騰訊課堂)
height 授權 http 輸出日誌 14. mage src 下載 ssi Shiro作用: 認證(登錄)、授權(鑒權)、加密(用戶名/密碼加密)、會話管理(session)、Web集成、緩存 apache官網可以下載 圖一 圖二
Jersey 2.x JDK 上的客戶端應用
如應用是執行在 JDK 上的話,你只需要使用 JAX-RS 中的客戶端部分就可以了,這個根據你使用的客戶端有所調整。 這裡有一系列的模組是可以供你使用的,例如 grizzly 或 apache 或 jetty connector(請參考下面的的依賴表格)。Jersey 客戶端預設使用 JDK 進行
linux虛擬機器上svn客戶端連線問題
背景 &
財路網每日原創推送:終於按捺不住,騰訊也要上交易所發幣?
據CCN最新訊息稱,騰訊遊戲已經宣佈與區塊鏈電子競技娛樂平臺SLIVER.tv合作,建立一個電子競技直播頻道。據財路網記者查閱相關資料顯示,該頻道還發行了自己的代幣Theta,而且還在眾多知名交易所上市交易了,這是不是意味著騰訊在變相上交易所發幣呢? 與區塊鏈遊戲直播合作據悉,騰訊合作的這個平臺是一個全
爬取騰訊課堂的課程評論
最近想了解一下線上教育的課程的如何去選擇,課程的質量如何?所以試著去爬了一下騰訊課堂,只爬了IT網際網路這一項。 通過分析發現要想爬取到評論需要是個步驟: 解析學習方向,如下圖所示: 通過開發者工具審查元素,發現標籤在<dl class="sort-me
再獲殊榮!起點學院榮膺騰訊課堂《創造101》“火箭機構”獎!
9月12日,起點學院受邀參加騰訊課堂舉辦的“IT網際網路線上教育機構交流大會”,此次閉門會議僅有騰訊課堂101家機構受邀參加。 起點學院創始人曹成明先生參與“極致課程服務-線上教育怎樣提供優質的服務體驗”的圓桌研討,就多年對於教育的思考和實踐與現場教育同仁共同探討,以尋
指令碼之家上UC×××手機客戶端
UC×××手機客戶端款功能非常全面的掌上購彩APP,給使用者提供存取方便、彩種全面的手機×××。UC×××網手機版包括當前最熱門的足球競猜、籃球競猜、北京單場、×××、重慶×××等等各種×××的玩法。 UC×××手機客戶端功能特色介紹: 更穩定:實力站點,致力於打造一個公平、誠信、共贏的娛樂平
腳本之家上UC×××手機客戶端
手機 站點 腳本 服務 重慶 娛樂平臺 24小時 href 等待 UC×××手機客戶端款功能非常全面的掌上購彩APP,給用戶提供存取方便、彩種全面的手機×××。UC×××網手機版包括當前最熱門的足球競猜、籃球競猜、北京單場、×××、重慶×××等等各種×××的玩法。 UC
騰訊課堂視訊下載工具 批量下載
騰訊課堂視訊下載工具 最新版本:3.6 版本號:3.6.180905 檔案大小:16.56M 系統支援:Win7/Win8/win10 簡介:自動分析騰訊課堂視訊(一套視訊),提供下載功能,分片視訊合成功能。可以線上下載騰訊課堂高清視訊 1、程式下載支援性:
騰訊安全與青藤雲安全聯合釋出“天眼雲鏡”主機安全產品
11月28日,騰訊安全與青藤雲安全在北京召開發佈會,宣佈在雲安全領域展開戰略合作。以騰訊雲提供的高效穩定、安全可控的雲服務為基礎,加碼雲安全建設,為行業客戶提供“天眼雲鏡”企業私有資料中心主機安全解決方案。寬頻資本合夥人劉唯、騰訊雲副總裁黎巍、青藤雲安全創始人兼CEO張福等出席本次釋出會。
JS+HTML5實現前端的圖片壓縮上傳到騰訊的COS上
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="w