1. 程式人生 > >騰訊課堂點播上雲客戶端實踐總結

騰訊課堂點播上雲客戶端實踐總結

導語 | 自從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:單個連線,儲存了連線資訊。

主要用法步驟:

  1. 呼叫mg_mgr_init進行初始化;
  2. 呼叫mg_bind,第2個引數為需要監聽的埠號,第3個引數為處理請求的handler;
  3. 呼叫mg_set_protocol_http_websocket將上一步返回的mg_connection與內建的http handler繫結。這樣我們的handler才能收到http事件;
  4. 通過一直呼叫mg_mgr_poll接收請求。

(3) Cache功能

使用本地代理一個重要作用就是Cache。

  1. 首先快取m3u8檔案內容;

  2. 當播放器請求第1個ts分片,非同步請求下一個ts分片並快取資料;

  3. 當播放器請求分片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