隨著音視頻業(yè)務(wù)的快速發(fā)展,作為前端工程師,我們團隊也逐步深入到音視頻編解碼領(lǐng)域,涉及到流媒體技術(shù)中的文本、圖形、圖像、音頻和視頻多種理論知識的學(xué)習(xí),并有機會大規(guī)模應(yīng)用到具體實踐中。 我們自研了Web播放器并支持h.265解碼,保持畫質(zhì)不變情況下,將碼流降低50%,達到減少帶寬成本,真正做到了h265解碼播放的全域覆蓋。本文主要分享了我們基于WebAssembly實現(xiàn)H.265格式的解封裝、解碼和播放。 背景 H.265 又稱HEVC(全稱High Efficiency Video Coding,高效率視頻編碼),是ITU-T H.264/MPEG-4 AVC標準的繼任者。相比H.264,H.265擁有更高的壓縮率,也就意味著同樣碼率(又稱比特率是指每秒傳送的比特(bit)數(shù)。單位為bps(Bit Per Second),比特率越高,每秒傳送數(shù)據(jù)就越多,畫質(zhì)就越清晰),H.265的畫質(zhì)會更清晰,更高的壓縮率就能使用更低的存儲和傳輸成本。 帶寬成本:在有限帶寬下H.265能傳輸更高質(zhì)量的網(wǎng)絡(luò)視頻,理論上,H.265最高只需H.264編碼的一半帶寬即可傳輸相同質(zhì)量視頻。更低的帶寬可以更好的降低存儲及傳輸成本,并為未來基于短視頻及直播領(lǐng)域更多更復(fù)雜好玩的互動玩法做鋪墊。 轉(zhuǎn)碼成本:但是當前主流瀏覽器均不支持H.265原生視頻播放,因此通常視頻生產(chǎn)端需要針對瀏覽器做一次H.264視頻的轉(zhuǎn)碼來適配瀏覽器端如PC場景的播放,而增加了轉(zhuǎn)碼成本。如在淘寶直播中,假設(shè)以每天5萬場直播計算,每場直播轉(zhuǎn)碼成本20元,一天就是100萬的轉(zhuǎn)碼成本。 為此,我們團隊對瀏覽器端H.265視頻播放的可行性及兼容性進行了一次探索,為移動端及PC端全量H.265做準備,也對瀏覽器端視音頻處理、WebAssembly實踐進行一次深入的嘗試。 H.264 vs H.265 H.264是當下用的最為廣泛的視頻編碼格式,H.265標準圍繞著現(xiàn)有的視頻編碼標準H.264,保留原來的某些技術(shù),同時對一些相關(guān)的技術(shù)加以改進。新技術(shù)使用先進的技術(shù)用以改善碼流、編碼質(zhì)量、延時和算法復(fù)雜度之間的關(guān)系,達到最優(yōu)化設(shè)置。H.265和H.264都是基于塊的視頻編碼技術(shù),主要的差別在于編碼單元的大小以及一些編碼算法細節(jié),H.265將圖像劃分為“編碼樹單元(coding tree Unit, CTU)”,而不是像H.264那樣的16×16的宏塊。根據(jù)不同的編碼設(shè)置,編碼樹單元的尺寸可以被設(shè)置為64×64或有限的32×32或16×16。一般來說區(qū)塊尺寸越大,壓縮效率就越好。具體的算法及相關(guān)細節(jié)這里不具體展開了,還有一些其他的壓縮算法如因為H.265專利限制而生的開放編碼格式如AV1等,讀者可以參考其他相關(guān)文章。 如下圖,可以看到同樣主觀畫面質(zhì)量,H.265(500K)僅需H.264(800K)一半左右的帶寬碼率。 瀏覽器現(xiàn)狀 如下圖,因為H.265專利及硬解支持情況不完善的原因,主流現(xiàn)代瀏覽器均不兼容H.265編碼的視頻播放(Edge新版本以插件方式支持),但是因為Apple對H.265的支持(這里作者認為這可能是一個很重要的標志,因為技術(shù)的發(fā)展很多時候不光是這個技術(shù)本身所決定的,而是很多因素共同作用的結(jié)果,商業(yè)也是其中很重要的一個因素),移動端ios safari在11.0版本以上支持原生播放。 想要在瀏覽器端播放H.265視頻原生的<video />標簽沒有辦法支持,但是因為視頻格式本身是連續(xù)圖像畫面和音頻的集合,參考了chromium的源碼及video標簽內(nèi)部的實現(xiàn)原理,可以通過<canvas /> + Web Audio API 的結(jié)合來模擬實現(xiàn)一個虛擬的video標簽來實現(xiàn)播放器功能。 Demo 因為直播流時效性的緣故,發(fā)布了一個播放H.265 mp4視頻(該視頻地址直接在瀏覽器中播放只有聲音而沒有畫面)的在線Demo,讀者可以有一個直觀感受。 地址: https://g./videox/mp4-h265/1.0.2/index.html 效果 前期調(diào)研 播放器整體架構(gòu) 基于傳統(tǒng)播放器的架構(gòu),我們設(shè)計的播放器架構(gòu)如下: 視音頻基礎(chǔ) 因為前端領(lǐng)域?qū)σ曨l領(lǐng)域的涉及場景不多,一個<video />標簽就可以滿足大部分場景,但是經(jīng)歷了這幾年直播和短視頻的爆發(fā),視頻的需求和功能也變得越來越復(fù)雜,開發(fā)之前閱讀了很多視音頻領(lǐng)域相關(guān)的書籍和文章,在此先對視音頻基礎(chǔ)進行一個簡單的介紹。 視頻中我們通常說的視頻的格式,比如 .mp4, .mov, .wmv, .m3u8, .flv 等等被稱為container。在一個視頻文件中音頻、視頻數(shù)據(jù)是分開存儲的,使用的壓縮算法也不一樣。其中container作為容器主要包含了video數(shù)據(jù)、audio數(shù)據(jù)、metadata(用于檢索視音頻payload格式等信息)。每個格式的封裝格式不一樣,比如FLV格式的基本單元是Tag,而MP4格式的基本單元是Box,輔助的meta信息用于檢索找到對應(yīng)的原始數(shù)據(jù)。 而平時聽到的H.264, H.265等視頻編碼標準被稱為codec (COmpress and DECompress )。一個視頻格式比如mp4可以使用任何標準化的壓縮算法,這些信息都會被包含在一個視頻文件的meta信息中來告訴播放器該用什么編解碼算法來播放。 客戶端播放器 一個傳統(tǒng)的客戶端播放器播放一個視頻流經(jīng)過了如下各個環(huán)節(jié): 拉取數(shù)據(jù) => 解封裝 => 音視頻解碼 => 采樣/像素數(shù)據(jù)發(fā)送到設(shè)備進行渲染。 client 對于流媒體,播放器客戶端通過拉流以數(shù)據(jù)源(音視頻流)為中心,進行管道式的傳輸。在此期間,對視頻流的讀取,轉(zhuǎn)換,分類,復(fù)制等一系列操作處理,以封裝的mp4流為例,需要對流進行解封裝、解碼、渲染等步驟: 瀏覽器video標簽 在探究的過程中,為了了解主流瀏覽器不支持H.265視頻播放的原因,以及瀏覽器端實現(xiàn)播放器原理的了解,通過對Chromium瀏覽器官方文檔及video標簽實現(xiàn)源碼的閱讀,整理了一個流程圖。 可以看到瀏覽器內(nèi)部對視頻流播放的實現(xiàn),在經(jīng)過了PipelineController等數(shù)據(jù)傳輸管道的處理后利用FFmpeg軟解或者Gpu硬解之后交給視頻設(shè)備及音頻設(shè)備進行同步及渲染。其中H.265的視頻因為硬解支持情況不完善,軟解可能有性能風(fēng)險,所以在chrome中被關(guān)閉了不支持,在chromium中可以通過參數(shù)打開。我們就依照這個思路,利用瀏覽器提供的接口來實現(xiàn)一個模擬的video標簽。 設(shè)計過程 開發(fā)思路 開發(fā)思路按照從簡單到復(fù)雜的過程,對任務(wù)進行拆分,來完成H.265視頻點播及直播等各個場景的覆蓋,以mp4短視頻出發(fā)完成播放流程,再覆蓋直播場景,考慮如網(wǎng)絡(luò)抖動、內(nèi)存控制等復(fù)雜因素,再針對直播m3u8等回放文件進行播放并開發(fā)視頻seek、倍速等功能。 mp4播放=>flv播放=>hls播放=>加入seek、倍速等功能 可行性分析
MP4點播流播放
FLV直播流播放
當前方案 播放流程
解碼器編譯 通過Emscripten工具可以把C語言編寫的FFmpeg庫編譯成wasm并在瀏覽器中應(yīng)用到視音頻解碼中。 我們的視頻解碼場景和通常的播放器一樣,通過依賴FFmpeg的通用接口來實現(xiàn)解封裝和解碼的工作。先通過emscripten編譯ffmpeg庫,再通過靜態(tài)庫的方式依賴到解封裝和解碼入口程序中。 測試表現(xiàn) 性能測試 測試視頻 因為flv直播視頻受時效性影響較大,拿720P高清的H.265 mp4視頻作為穩(wěn)定輸入測試 地址: https://gw./bao/uploaded/LB1l2iXISzqK1RjSZFjXXblCFXa.mp4?file=LB1l2iXISzqK1RjSZFjXXblCFXa.mp4 視頻參數(shù): 測試機器
性能情況
意味著最高能提供720P高清視頻如下幀率視頻流暢播放的能力: 可以看到這兩臺機器中,在非高速運動等普通的如電商場景25fps幀率的高清720p視頻已經(jīng)能達到生產(chǎn)環(huán)境的標準,但是距離原生的速度還有一定距離。 瀏覽器兼容性 主要用到了WebAssembly及WebWorker的支持,實際測試中主流瀏覽器Chrome、Safari、Firefox、Edge均能通過兼容性測試。
ToDo 當前的技術(shù)方案已經(jīng)能在大部分機器的主流瀏覽器上流暢的播放720P的高清直播流,但是在Edge瀏覽器及性能稍差的機器上還是存在高清視頻解碼性能不能滿足流暢播放的風(fēng)險,針對WebAssembly達到native速度的目標還有一定距離,尤其是匯編并行計算的支持,在視音頻及大規(guī)模數(shù)據(jù)處理中是很常見的性能優(yōu)化策略,作者整理了幾個優(yōu)化的方向,在未來還有更多探索的空間:
未來展望 通過H.265視頻播放將開源視音頻庫FFmpeg的能力及WebAssembly性能的優(yōu)勢在瀏覽器端視音頻處理上有了一次深入的嘗試。視頻作為一種多媒體形式,相比現(xiàn)有的文字、圖像、音頻都能有更生動及更豐富信息的表現(xiàn)。尤其經(jīng)過了直播和短視頻的爆發(fā)增長后,成為了一種基礎(chǔ)的多媒體形式,也是網(wǎng)絡(luò)及移動端手機性能等技術(shù)發(fā)展的體現(xiàn)。未來隨著5G及更高性能的硬件設(shè)備的發(fā)展會被更廣泛的應(yīng)用到各個領(lǐng)域。瀏覽器在這場視頻革命中也是不可或缺的一個環(huán)節(jié),通過這次的探索,為未來瀏覽器端擴展視音頻處理的通用能力提供了想象的空間,同時也在瀏覽器端通過WebAssembly向native性能及能力靠近的路上做了一個落地的嘗試,雖然從測試情況看現(xiàn)在的表現(xiàn)還不如native,但是隨著標準及技術(shù)的演進,為未來對性能要求比較高的圖形圖像及人工智能等相關(guān)方向在瀏覽器端處理一定會漸漸被廣泛的應(yīng)用起來,比如如下幾個方向:
參考
點擊【閱讀原文】或掃描圖中二維碼了解LiveVideoStackCon 2019 上海 音視頻技術(shù)大會 最新日程信息。 |
|