文 / 陳彬
大家好,我是陳彬,目前在快手負責短視訊架構工作,主要負責構建快手的移動端多媒體引擎,提供短視訊拍攝、編輯、釋出等視訊創作的基礎能力,還有消費側的播放器SDK和短視訊後端轉碼服務。在加入快手之前,從事過很多視訊技術相關的領域,如視訊編解碼演算法、傳輸演算法、多媒體晶片、OTT裝置等。
今天,我演講的主題是“快手移動端高效能多媒體引擎”,將重點圍繞高效能這一話題來展開,從巨集觀到微觀,介紹引擎的整體架構和具體場景的優化手段。演講分為快手多媒體引擎概況、高效使用硬體資源、拍攝和編輯場景的效能優化三個部分,最後一起展望一下5G+邊緣計算在短視訊方面的應用。
1. 快手多媒體引擎概況1.1 UGC平臺
眾所周知,快手是一個短視訊UGC平臺,而視訊內容的生產是內容供給的源頭,使用者通過使用手機的拍攝和編輯功能創作視訊,然後上傳到快手平臺。之後,後端伺服器利用AI技術對這些視訊進行內容理解,把理解的資訊傳送給推薦引擎,推薦引擎結合使用者興趣,進行個性化推薦,進行分發消費。消費使用者通過觀看、點贊、評論和私信等動作產生一系列的互動行為,這些互動行為同時又進一步促進了內容的生產。
這是一個正向反饋的鏈路,社群像滾雪球一樣不停的增長。這就是快手最重要的UGC生態閉環。
快手目前DAU超過2億,作者數1.9億,每天新增作品數1500萬,生產者的比例也很高,使用者分佈非常廣,手機型號有幾千款,價格區間從幾百元到幾千元。這些生產者使用快手移動端的多媒體引擎來進行創作,通過AI技術賦能內容生產,為使用者提供生產創意,降低生產門檻,從而提升作品的數量和品質。
1.2 AI賦能內容生產AI技術落地是非常困難的,快手想要實現AI落地,首先要做好基礎平臺、演算法和產品這三個要素。基礎平臺是指移動端多媒體平臺,包括快手自研的深度學習推理引擎YCNN、3D渲染引擎和多媒體引擎。複雜的AI演算法執行在這三個高效能的引擎上,例如人體理解、場景理解、語音識別、影象增強等演算法,這些演算法的效果通過產品形態呈現給使用者。
舉例說明這些AI演算法的落地場景。第一個是“萌面”魔法表情,使用者在拍攝視訊的時候。無需3D結構光攝像頭也可以實時捕捉面部表情,並實時把面部表情通過卡通頭像的形式展現,能夠實現非常豐富的面部表情。第二個是梵高的天空特效,使用了天空識別演算法。第三個是前段時間特別受歡迎的娃娃臉,通過GAN技術把使用者的臉秒變童顏,可以在安卓和iOS大部分的機型上實時執行,技術挑戰非常大,快手也是國內首家實現這項技術的公司。第四個是自動新增字幕功能,通過識別演算法,將語音轉換為文字。最後一個是暗光增強演算法,通過該演算法可以對暗光環境下拍攝的視訊進行提亮和去噪,還原更多的細節。
1.3 快手短視訊生產消費整體鏈路上圖是我們整個生產到消費的鏈路,由作者端、雲端和觀眾端三部分組成。作者端也就是生產側,通過拍攝、匯入、編輯等操作生產視訊,然後把視訊傳送到雲端,雲端對視訊進行儲存和轉碼,分發給CDN,最終通過CDN網路傳輸給使用者進行消費。本次演講內容的重點是位於作者側的移動端多媒體引擎。
1.4 快影在快手主app之外,我們還孵化了一些獨立的內容生產App。說到視訊製作方面,就必須介紹視訊剪輯工具——快影,它主要面向更專業一些,需要在移動端進行較複雜視訊編輯的使用者。
快影最近霸佔了App Store免費排行榜榜首的位置。它的功能更加專業,支援超高清視訊的編輯和AI特效功能,是快手移動端多媒體引擎賦能的一個代表性產品,我下面將會用快影的案例進行分析。
1.4.1 多媒體引擎是什麼簡單來說,多媒體引擎主要負責視訊的採集和後期處理,其功能分為拍攝和編輯。拍攝包括濾鏡、美顏美妝、AI特效等功能,編輯包括了剪輯、轉場和貼紙等功能。
這些功能的背後面臨著4K解析度、3D渲染、美顏美妝、端上AI等技術挑戰。這些挑戰都需要龐大的計算量,再加上實時處理的需求,可謂是難上加難。要解決這些問題,首先就必須要高效的使用硬體資源。
2. 高效利用硬體資源2.1 並行化基本原則手機端的硬體資源主要有CPU、GPU、HW Codec等模組,使用這些資源最簡單的辦法是輪流使用,但這種方法並不高效,例如,會出現CPU工作,但是GPU空閒的情況。因此要做到並行化,讓所有硬體同時工作,這是一個非常基本的原則,也是快手多媒體引擎架構設計的一個指導思想。
3. 拍攝和編輯場景的效能優化3.1 拍攝場景理清設計的指導思想後,再看一下具體的優化場景。對於拍攝,從相機採集的一幀視訊資料先後要經過影象演算法、濾鏡、美顏美妝、魔法特效等模組,然後分成兩路,一路給實時預覽,一路給錄製,整個流程要在33毫秒之內完成(30fps)。
3.2 拍攝的架構拍攝的架構需要支撐起實時採集、實時處理、實時預覽和實時錄製的應用場景。整個架構從下往上分成三層。
最下面一層是採集和渲染的Pipeline流水線,由採集模組、CPU處理單元、GPU處理單元、顯示模組和錄製模組組成。
中間一層由各個演算法模組和特效渲染模組組成,是以plugin的形式插入到底層渲染流水框架中,類似ffmpeg的filter,通過排列組合,實現各種效果。這些filter之間是有依賴關係的,由一個負責依賴管理的模組DependencyManager進行控制。在此之上是非常重要的monitor模組,它對整個流水線進行實時監控,包括演算法模組耗時、CPU負載、GPU負載、記憶體使用量、幀率以及解析度等方面。
這些資料實時採集後傳送到快手後端的流媒體大資料平臺,進行實時清洗、聚合和展示。基於這些資料,可以實時監控生產模組的效能。整個過程是分鐘級別的延遲,也就是說,拿出快手APP進行拍攝,一分鐘之後就能在後臺看到整個操作流程的效能資料。根據這些效能資料,對架構進行鍼對性的優化。這也是快手一直以來實踐的方法,以大資料為驅動來進行效能優化,提升使用者體驗。
中間層之上是APP介面層,在安卓和iOS平臺上分別提供了Java和OC的介面。整個架構作為一個跨平臺的方案,除了最上層的APP介面層,大部分使用C++來實現。
前面提到的高效使用硬體資源的思想體現在框架圖中最底層的鏈路上,從相機採集的資料先傳遞給CPU處理模組,CPU處理完之後把資料傳給GPU,然後CPU立刻再去相機採集下一幀的資料。在同一時間點,CPU正在處理當前剛採集的一幀資料,而GPU正在處理前一幀的資料,CPU和GPU是並行工作的,這就是高效利用硬體思想的一個很好的體現。
框架圖中的YCNN引擎是快手Y-TechAI實驗室開發的移動端的推理引擎,各類AI演算法都執行在YCNN上。例如,最常用的人臉關鍵點演算法,人體關鍵點演算法和手勢關鍵點演算法。YCNN引擎通過Metal、OpenCL、SIMD這些加速方式,充分利用底層的CPU、GPU和NPU資源。除了高效使用這些硬體資源之外,還做了4個方面的優化,第一點是運算元融合,把運算元打包在一起,load進CPU的cache,這樣可以減少分別load的額外消耗。第二點是記憶體優化,儘量避免頻繁地記憶體讀寫操作,儘量一次讀完資料,處理完後一次性寫入,避免對同一段資料反覆讀寫,同時要注意做記憶體排布優化,增加cache命中率。另外兩點是通用的磁碟I/O優化和多執行緒優化。
經過這些優化後,在iPhone6手機上實測,人臉關鍵點處理速度是200fps,一秒能處理200幀影象,人體關鍵點是90fps,人體分割是100fps,都是業界非常優秀的效能。
3.3 解析度和幀率的變化除去技術側效能的指標,快手也很注重從使用者主觀感受出發,衡量優化對使用者體驗的收益。快手製定了拍攝場景的三個關鍵指標:解析度、幀率和卡頓率。解析度和幀率很好理解,而卡頓率一般出現在視訊播放場景。先看解析度和幀率的變化,隨著多媒體引擎的上線以及持續效能優化,快手的拍攝解析度從之前540P升級到720P,部分機型已經升級到1080P,幀率也在持續的上升,實現了更清晰和更流暢。
3.4 卡頓率但是,我們發現,僅靠平均幀率並不能全面反映一個視訊的流暢度。以一個實際例子來看,我們一位同事去澳洲旅遊,在當地拍攝的這段視訊裡,出現袋鼠的畫面特別卡頓,但是,整個視訊的平均幀率其實已經達到20fps以上。正常情況下,20fps+是比較流暢的,而這個視訊卻看起來很卡,什麼原因呢?
我們仔細看了一下幀率的分佈,發現幀率分佈非常不均勻,因此發現之前評估視訊是否流暢僅靠平均幀率是有缺陷的。為了解決這個問題,快手定義了拍攝卡頓率指標。相鄰兩幀時間戳之間的差值大於200毫秒就認定為卡頓,卡頓率是指發生過卡頓的次數除以總的拍攝次數。卡頓率結合平均幀率才能更全面地去衡量拍攝視訊的流暢度。
3.5 卡頓率的變化從上圖的卡頓率的曲線可以看到,經過優化後,卡頓率在持續下降。通過解析度、幀率和卡頓率這三個指標,可以看到,經過持續的優化,使用者感知是更加清晰、流暢。
3.6 編輯場景在編輯場景方面,上圖兩個頁面是快影的主要頁面,其中展示了快影的部分編輯功能。左邊頁面包括了新增視訊片段、分割、倒放和旋轉等操作,右邊頁面是新增轉場的操作。
相比於iOS,安卓端的技術挑戰更大。安卓硬體解碼是一個老生常談的問題,相比於軟體解碼器,硬體解碼器更快,特別是在高解析度視訊場景下,優勢更加明顯。
3.7 安卓硬解碼上圖是匯入一個4K視訊進行編輯的場景,左邊是市面上一款很紅的編輯工具,從預覽頁面點選“下一步”到編輯頁時,有一個“合成中”的等待,之後才能進入編輯頁。需要等待的原因是視訊的解析度太高,如果不使用硬體解碼器,很難在編輯頁面做到實時操作,因此需要提前做一次轉碼,進行預處理,把解析度降低。右邊的是快手,同樣的視訊點選“下一步”,立刻就能進入到編輯頁,不需要進行預處理,這就是硬體解碼器的功勞。
3.8 安卓硬解碼存在的問題安卓硬解碼在具備以上優點的同時,也存在著很多問題:第一,安卓的機型特別多。第二,解碼器的輸出格式多樣,效能不一。第三,支援的解析度不一樣。針對這些問題,業界常用的解決辦法是黑白名單,快手一開始也做了黑白名單,但是,黑白名單是一個後置的策略,必須先知道機型,在發現有問題之後才能加到名單裡,這樣的操作並不智慧,往往需要人工干預。快手的解決方案是跑Benchmark,自動選擇最佳模式,不需要人工干預,在手機端執行測試程式選出最佳模式。
3.9 硬解Benchmark3.9.1 支援哪些解析度?
雖然手機都會宣告支援哪些解析度,但實際情況,還是要檢測解碼的正確性。把不同解析度特定pattern的視訊輸入給解碼器,檢查解碼出來的YUV資料正確性。
3.9.2 Surface輸出 & Bytebuffer輸出解碼器一般都支援幾種輸出格式,快手使用跑馬策略,同樣的視訊輸入給解碼器,選擇解碼速度最快的輸出格式。
使用了自動Benchmark後,快影的硬體解碼器覆蓋率,從70%提升到90%+,這是一個非常大的提升。硬解是所有流暢編輯體驗的基礎。
3.10 Seek優化連續Seek是視訊編輯操作過程中很常見的一個場景,特別容易出現卡頓的情況,需要進行大量的優化。為了達到理想的使用者體驗,需要做到兩點:第一點,畫面連續顯示,這不是簡單的seek,而是連續seek的過程,因此不能出現靜止幀的情況;第二點,畫面要能跟上手指移動的速度。
為了滿足上述兩點,我們設計了一個複雜而精巧的機制,能夠做到保持解碼器連續工作,不做重置,實現了seek跟手的流暢體驗。重點講下前向seek,也就是倒放。在保持解碼器連續工作時,還可以在解碼前丟棄一些非參考幀,只解碼參考幀,減輕解碼器的負擔。這樣兩方面優化,可以實現流暢的前向seek體驗。
3.11 轉場優化轉場也屬於編輯時常用的功能,在兩段視訊的交接處,往往容易卡頓,因為在渲染的時候需要兩路解碼。我們通過提前預熱解碼器的方法來解決這個問題,實現了流暢的轉場預覽效果。
舉例上圖,左右兩段表示兩個視訊片段。左邊橘色解碼器解到接近交界位置的時候,建立藍色解碼器,並讓其預解碼幾幀。當渲染轉場效果時,因為藍色解碼器已經提前預解碼了,此時就只有橘色的解碼器在工作,整體負載比較低,就能夠實現流暢的效果。
4. 5G的關鍵能力最後說一下我們對5G的展望。5G的特點是兩高一低:高頻寬,數百兆甚至數十G的峰值傳輸頻寬;低延遲,10毫秒以內的端到端延遲;高可靠,頻寬和延遲非常穩定。這使得5G能夠提供非常高效的通訊鏈路。
有了這個通訊鏈路,我們認為,就有可能把端上採集的資料,實時發給雲端處理。利用雲端強大的處理速度執行各類複雜的演算法,把處理完的資料再實時傳輸到移動端顯示。整個過程如果在33毫秒之內完成,就意味著達到了實時的效果。利用雲端計算力可以解決手機的效能瓶頸問題。在5G的加持下,藉助雲端的計算力,就能實現更加複雜的AI演算法和更加逼真的CG渲染效果,提供更酷炫的視訊製作體驗。這個未來需要5G+邊緣計算結合來實現。快手會在這些新方向上持續、深入的探索。