[梁春章]
移動(dòng)互聯(lián)網(wǎng)的普及加速視頻消費(fèi)時(shí)長(zhǎng)的增長(zhǎng),不限流量的資費(fèi)套餐與移動(dòng)視頻消費(fèi)習(xí)慣相互促進(jìn),消費(fèi)者對(duì)VOD 的滿意度高于Liner TV,這些視頻內(nèi)容快速增長(zhǎng),帶來(lái)視頻內(nèi)容存儲(chǔ)大容量訴求,促進(jìn)移動(dòng)云盤存儲(chǔ)高速增長(zhǎng);這些增長(zhǎng)對(duì)移動(dòng)云盤轉(zhuǎn)碼提出更高的性能要求,面臨如下挑戰(zhàn):
(1)多元化/大規(guī)模/高并發(fā)的點(diǎn)播業(yè)務(wù)提出更高的轉(zhuǎn)碼和加速需求。
(2)用戶播放體驗(yàn)對(duì)低延遲的實(shí)時(shí)轉(zhuǎn)碼有高訴求。
(3)降低成本,提高效率,提升客戶體驗(yàn)。
移動(dòng)云盤轉(zhuǎn)碼主要提供移動(dòng)云盤業(yè)務(wù)的音頻/視頻在不同終端、網(wǎng)絡(luò)環(huán)境下的多媒體轉(zhuǎn)碼及在線視頻播放標(biāo)準(zhǔn)文件支撐。轉(zhuǎn)碼能力現(xiàn)網(wǎng)存在問(wèn)題:
(1)轉(zhuǎn)碼音視頻增量明顯,現(xiàn)網(wǎng)資源無(wú)法滿足至規(guī)劃期。在移動(dòng)云盤業(yè)務(wù)大發(fā)展背景下,文件轉(zhuǎn)碼處理壓力逐日增大,并出現(xiàn)任務(wù)排隊(duì)情況。
(2)現(xiàn)網(wǎng)資源類型無(wú)法支撐實(shí)時(shí)轉(zhuǎn)碼,存儲(chǔ)使用規(guī)模大:現(xiàn)網(wǎng)資源為通用PC 服務(wù)器類型,對(duì)圖像/視頻轉(zhuǎn)碼支撐能力弱,僅能提供離線轉(zhuǎn)碼能力,轉(zhuǎn)碼后文件存儲(chǔ)帶來(lái)長(zhǎng)期的云存儲(chǔ)空間消耗,如圖1 所示。
隨著互聯(lián)網(wǎng)和移動(dòng)設(shè)備的普及,實(shí)時(shí)轉(zhuǎn)碼技術(shù)[1]變得至關(guān)重要。在線流媒體平臺(tái)需要將高清視頻轉(zhuǎn)碼為多種分辨率和編碼格式,以適應(yīng)不同設(shè)備和網(wǎng)絡(luò)環(huán)境。
音視頻轉(zhuǎn)碼技術(shù)[2]的歷史經(jīng)歷了從基礎(chǔ)的編碼標(biāo)準(zhǔn)到高效的壓縮算法、硬件加速以及實(shí)時(shí)轉(zhuǎn)碼的演變,業(yè)務(wù)流程如圖2 所示。
圖2 在線轉(zhuǎn)碼播放架構(gòu)
3.2.1 網(wǎng)絡(luò)分發(fā)——HLS 協(xié)議
HLS 全拼是HTTP Live Streaming[3],是一個(gè)由蘋果公司提出的基于HTTP 的流媒體網(wǎng)絡(luò)傳輸協(xié)議。工作原理:把整個(gè)流分成一個(gè)個(gè)小的(標(biāo)準(zhǔn)是10 秒一個(gè))基于HTTP 的文件來(lái)下載,每次只下載一些。當(dāng)媒體流正在播放時(shí),客戶端可以選擇從許多不同的備用源中以不同的速率下載同樣的資源,允許流媒體會(huì)話適應(yīng)不同的數(shù)據(jù)速率。在開始一個(gè)流媒體會(huì)話時(shí),客戶端會(huì)下載一個(gè)包含元數(shù)據(jù)的extended M3U (M3U8) playlist 文件,用于尋找可用的媒體流。與實(shí)時(shí)傳輸協(xié)議(RTP)不同,HLS只請(qǐng)求基本的HTTP 報(bào)文,可以穿過(guò)任何允許HTTP 數(shù)據(jù)通過(guò)的防火墻或者代理服務(wù)器。
(1)視頻的封裝TS 格式。
(2)視頻的編碼格式為H264,音頻編碼格式為MP3、AAC 或者AC-3。
(3)除了TS 格式視頻文件本身,還定義了用來(lái)控制播放的M3U8 格式文件。
(4)HLS 使用的HTTP 協(xié)議傳輸數(shù)據(jù),不會(huì)遇到被防火墻屏蔽的情況。
(5)HLS 基于無(wú)狀態(tài)協(xié)議,客戶端只是按照順序使用下載存儲(chǔ)在服務(wù)器的普通TS 格式文件,做負(fù)載均衡十分簡(jiǎn)單。
(6)由于服務(wù)器存在多個(gè)碼率的海量小文件,對(duì)存儲(chǔ)要求高。
(7)HLS 協(xié)議本身實(shí)現(xiàn)了碼率自適應(yīng)[4],不同帶寬的設(shè)備可以自動(dòng)切換到最適合自己碼率的視頻播放。
與業(yè)界主流傳輸協(xié)議相比,RTMP 協(xié)議不使用標(biāo)準(zhǔn)的HTTP 接口傳輸數(shù)據(jù),在一些特殊的網(wǎng)絡(luò)環(huán)境下可能被防火墻屏蔽掉;HLS 由于使用的HTTP 協(xié)議傳輸數(shù)據(jù),HLS不會(huì)遇到被防火墻屏蔽的情況;HLS 協(xié)議本身實(shí)現(xiàn)了碼率自適應(yīng),不同帶寬的設(shè)備可以自動(dòng)切換到最適合自己碼率的視頻播放[5]。通過(guò)音視頻前N 秒預(yù)轉(zhuǎn)碼機(jī)制,彌補(bǔ)HLS 在加載時(shí)延的短板,如圖3 所示。
圖3 業(yè)界主流協(xié)議對(duì)比
結(jié)合上述因素,HLS 更適合移動(dòng)云盤需求。
3.2.2 分布式轉(zhuǎn)碼——基于GPU 卡的并行轉(zhuǎn)碼
服務(wù)器收到用戶播放請(qǐng)求,根據(jù)請(qǐng)求參數(shù)進(jìn)行數(shù)據(jù)檢索,如果有緩存直接返回緩存相關(guān)的播放數(shù)據(jù),如果沒有則請(qǐng)求實(shí)時(shí)轉(zhuǎn)碼服務(wù)器進(jìn)行轉(zhuǎn)碼。
轉(zhuǎn)碼服務(wù)器讀取源視頻,根據(jù)播放參數(shù)將源視頻快速分割成子視頻分塊并進(jìn)行轉(zhuǎn)碼,向視頻文件切片服務(wù)器集群分發(fā)任務(wù),并生成相應(yīng)的播放索引返回給用戶。
并發(fā)執(zhí)行的轉(zhuǎn)碼任務(wù)結(jié)果將緩存在服務(wù)器,或者按用戶需求進(jìn)行持久化存儲(chǔ)。用戶按照索引依次請(qǐng)求視頻分塊,按序播放;而當(dāng)拖動(dòng)時(shí)間軸時(shí),云端會(huì)相應(yīng)進(jìn)行實(shí)時(shí)加速轉(zhuǎn)碼[6]和任務(wù)二次調(diào)度,降低用戶播放卡頓。
與傳統(tǒng)PC 轉(zhuǎn)碼服務(wù)器不同,GPU(圖形處理單元)由于擁有大量的并行處理單元,其并行計(jì)算能力可以同時(shí)處理多個(gè)數(shù)據(jù)塊,因此可以對(duì)音視頻進(jìn)行并行轉(zhuǎn)碼[7],例如同時(shí)對(duì)多個(gè)視頻幀進(jìn)行編碼或解碼,在視頻編碼中,幀間預(yù)測(cè)和幀內(nèi)預(yù)測(cè)等步驟可以并行處理,從而實(shí)現(xiàn)更快的編碼速度。GPU 的多核心結(jié)構(gòu)使得同時(shí)處理多個(gè)塊變得更加高效,并且,使用多個(gè)GPU 卡可以進(jìn)一步提高轉(zhuǎn)碼性能,尤其在需要處理大量任務(wù)或大規(guī)模轉(zhuǎn)碼時(shí)。因此,在音視頻轉(zhuǎn)碼中,GPU 可以用于加速編碼和解碼過(guò)程,從而大幅提高處理速度[8]。
移動(dòng)云盤客戶端上傳文件成功后,通過(guò)MQ 消息隊(duì)列[9]通知在線轉(zhuǎn)碼平臺(tái),在線轉(zhuǎn)碼平臺(tái)接收任務(wù)之后通過(guò)文件后綴來(lái)判斷是在線轉(zhuǎn)碼處理還是離線轉(zhuǎn)碼處理;如果是MP4 格式,則根據(jù)設(shè)定比例來(lái)進(jìn)行分發(fā)。
在線轉(zhuǎn)碼處理流程分為多個(gè)獨(dú)立線程處理:
(1)接收MQ 線程將收到的MQ 進(jìn)行分發(fā)判斷并相應(yīng)處理;
(2)下載線程查詢未下載狀態(tài)任務(wù)進(jìn)行下載處理;
(3)提取信息線程查詢未提取狀態(tài)任務(wù)進(jìn)行提取視頻信息處理;
(4)MQ 通知查詢未通知狀態(tài)任務(wù)進(jìn)行MQ 通知視頻提取結(jié)果。
具體流程圖如圖4 所示。
圖4 預(yù)處理流程圖
移動(dòng)云盤客戶端通過(guò)主M3U8 格式文件地址發(fā)起HTTPS 請(qǐng)求主播放列表。在線轉(zhuǎn)碼平臺(tái)處理流程為:通過(guò)CI 進(jìn)行鑒權(quán)處理,鑒權(quán)不通過(guò)則返回宣傳片主播放列表,鑒權(quán)通過(guò)則判斷主播放列表是否存在,存在則返回主播放列表,不存在則通過(guò)CI 調(diào)用二階段接口下載視頻,再提取視頻信息,生成主播放列表,最后返回主播放列表。
移動(dòng)云盤客戶端請(qǐng)求二級(jí)播放列表,在線轉(zhuǎn)碼平臺(tái)處理流程為:判斷二級(jí)播放列表是否存在,存在則返回二級(jí)播放列表,不存在則對(duì)視頻進(jìn)行轉(zhuǎn)碼處理,生成二級(jí)播放列表和TS 格式文件,最后返回二級(jí)播放列表。
移動(dòng)云盤客戶端請(qǐng)求TS 格式文件,在線轉(zhuǎn)碼平臺(tái)處理流程為:判斷TS 格式文件是否存在,存在則復(fù)制TS格式文件返回,不存在則返回空。
具體處理流程如圖5 所示。
圖5 在線轉(zhuǎn)碼播放流程圖
服務(wù)器 GPU 資源是否足夠,是根據(jù)轉(zhuǎn)碼路數(shù)進(jìn)行判斷,例如1 張 GPU 卡支持 10 路轉(zhuǎn)碼,但現(xiàn)在是一個(gè)視頻同時(shí)轉(zhuǎn)碼 3 個(gè)分辨率,故 1 張卡只能同時(shí)轉(zhuǎn)碼 3 個(gè)視頻,8 張卡能同時(shí)轉(zhuǎn)碼 24 個(gè)視頻,當(dāng)同時(shí)轉(zhuǎn)碼視頻達(dá)到24*75%(可配置)=18 個(gè)時(shí),就判斷為 GPU 資源不足。
為了充分利用現(xiàn)有離線轉(zhuǎn)碼資源,降低在線轉(zhuǎn)碼GPU設(shè)備需求,移動(dòng)云盤提出了離線與在線融合的轉(zhuǎn)碼播放架構(gòu)。在原有的流程中引入了isForce 參數(shù),當(dāng)參數(shù)值為1且GPU 資源充足時(shí)再通過(guò)GPU 實(shí)時(shí)轉(zhuǎn)碼[10]。具體處理流程如圖6 所示。
圖6 離線轉(zhuǎn)碼調(diào)度至在線轉(zhuǎn)碼
客戶端請(qǐng)求主播放列表,先解析出 ci 參數(shù),通過(guò) ci參數(shù)進(jìn)行鑒權(quán),鑒權(quán)不通過(guò)返回宣傳片的主播放列表,鑒權(quán)通過(guò)判斷主播放列表是否存在,如果存在則直接返回主播放列表,不存在則解析 M3U8 格式文件地址中是否有isForce 參數(shù),如果沒有該參數(shù),則下載視頻生成主播放列表返回,如果有該參數(shù),判斷該參數(shù)值是否為 1,不為 1返回 isForce 參數(shù)錯(cuò)誤,并返回錯(cuò)誤碼 601,如果為 1,則判斷服務(wù)器 GPU 資源是否足夠,如果不足則返回 GPU 資源不足,并返回錯(cuò)誤碼 600,如果足夠,則下載視頻生成主播放列表返回。
離線與在線轉(zhuǎn)碼融合后,移動(dòng)云盤整體轉(zhuǎn)碼能力提升了3 倍,同時(shí)視頻文件存儲(chǔ)資源占用減少50%(原離線轉(zhuǎn)碼流程,每個(gè)需文件轉(zhuǎn)碼三份包括流暢、標(biāo)清、高清,轉(zhuǎn)碼文件與原文件占比約1:1)。
如上所述,通過(guò)引入HLS 協(xié)議分發(fā)及GPU 硬件加速技術(shù),同時(shí)融合原有的離線轉(zhuǎn)碼集群,移動(dòng)云盤不但實(shí)現(xiàn)了實(shí)時(shí)轉(zhuǎn)碼,而且提高了轉(zhuǎn)碼播放速度,大大的提高了用戶體驗(yàn)。