1. 程式人生 > >窄帶高清轉碼技術實踐——技術沙龍分享實錄

窄帶高清轉碼技術實踐——技術沙龍分享實錄

序列 用戶 控制 圖像質量 兩個 意圖 失真 包含 -i

“轉碼”對於各家來說做法可能都不太一樣,但是邏輯是一樣的,我今天分享的是又拍雲關於窄帶高清的轉碼,貼近“轉碼”,更為底層,理論知識會相對較多一些。分享的內容主要分為兩塊,第一是介紹什麽是窄帶高清轉碼,第二是介紹又拍雲窄帶高清轉碼的實現方式。

首先說一下又拍雲對“窄帶高清”的定義:在編碼標準不變,文件的封裝格式不變的情況下,通過對畫面場景復雜度進行智能分析、智能碼率分配,節省 30% 的碼流。

一、什麽是窄帶高清轉碼

技術分享圖片

△ 轉碼架構圖

上圖是傳統的轉碼架構圖,不管是本地文件還是流媒體文件,先通過解封裝,使音頻和視頻分離,然後分別解碼,示意圖中間的 Option 是可選的。這個環節可以對音視頻進行處理,比如回聲去噪音,視頻做畫中畫、視頻圖像的處理等。做好處理或者直接跳過這一步,再到轉碼,這時候就要經過編碼,我們可以用各種不同的視頻編碼標準,音頻也可以用不同的音頻編碼標準做一個編碼壓縮,最後封裝起來成一個輸出文件,這個文件可以是本地的,也可以是網絡的流。

基於以上轉碼的架構,我們如果想通過轉碼,使轉碼後的文件變小,可以從三個方向做減少尺寸的操作(因為音頻對尺寸的貢獻量比較小,這裏討論以視頻為主,音頻暫不考慮)。首先可以采用新的視頻編碼標準,比如現在在研究的 H.266 ,可以降低大約 30% 到 50 % 的碼率;其次是文件的封裝格式,比如 FLV 和 MP4 ,受他們自身的封裝格式影響,雖然封裝的音頻流或者視頻流源頭都是一樣的,但是通過不同的封裝格式,大小也不一樣;第三點是窄帶高清轉碼。

技術分享圖片

1、視頻編碼標準

視頻編碼的標準,目前主流的是 H.264,2003 年 H.264 的標準就已經制定完成,H.265 是 2013 年定稿的,但是由於專利費用太高,所以應用還是以 H.264 為主。關於 H.266 的標準定稿時間確定在 2020 年底,屆時會推出新的編碼標準。此外以谷歌為代表的 AOM ,從 2008 年到 2013 年的 VP8、VP9,當時是以谷歌為主推,因為在芯片這塊的推廣效果不佳,所以也只是在谷歌自家應用。 AV1 在今年年初定了標準,大家對此寄予厚望,認為它是可以和 H.265 抗衡的。另外,還有中國的標準 AVx,目前只在國內使用。

我們考慮以 H.264、H.265 和 AV1 作為主要的參考標準,當然後面一代對於前一代來說,號稱碼流節省都是在 30% 到 50% ,這其實是非常可觀的數據。

技術分享圖片

△ 編碼標準的演變

以上對比圖顯示,在相同碼率下,AV1 比 H.264 和 H.265 質量都好;在相同質量下,它的碼率更節省。

2、文件封裝格式選擇

技術分享圖片

△ 文件封裝格式

上面是一個 YUV 文件的尺寸,包括分辨率和幀數的統計,YUV 文件原始 834 M,下面 H.264 裸碼流編出來 4 M ,然後這個尺寸封裝成 MP4 格式文件,MP4 格式的文件主要包含 moov 頭和 MDAT(音視頻數據)。moov 頭內封裝的是關於音視頻每一幀的信息,包括大小、時間戳等,它只增加了 7K ;如果相同的碼流封裝成 FLV 格式的文件則增加了 12 K,因為這裏幀數比較少,如果幀數比較多,還是很可觀的。FLV 文件每一幀都有一個頭,包括音頻和視頻,所以當它的文件增加一個尺寸,隨著幀數越來越多,尺寸也會越來越大;TS 就更不用說了,它是188字節一個包,封裝信息會更多,包括了一些媒體的信息等。

總的來說,對於實時性不強的場景,大部分都會選擇采用 MP4 格式。

3、窄帶高清

技術分享圖片

窄帶高清是基於以上的曲線圖考慮的:這裏有藍色和紅色兩個視頻序列,藍色表示運動比較緩慢的視頻,比如我現在演講,只是個人在動,背景都是靜止的,相對來說內容的運動是比較緩慢的;紅色表示運動比較劇烈的,比如《變形金剛》的電影。

以上兩個視頻序列的曲線可以這麽來解釋:PSNR 表示視頻的質量,當在 40 dB 的時候,藍色所需要的碼率跟紅色所需要的碼率,一個是不到 1M ,一個是大於 2M 多,運動程度不一樣的情況下,達到相同的質量,需要的碼率是不一樣的;而在相同碼率下,比如 2M 的情況下,運動劇烈的可以達到 40 dB ,而靜止的可以達到 45 dB,由此可見相同碼率下,運動劇烈和不劇烈的視頻質量不一樣。

因此這裏留給了我們一個操作的空間,我們在相同編碼標準和封裝格式不變的情況下,基於這兩個結論,在人眼感知不到它質量失真的情況下,減少視頻的碼率。測試結果顯示,碼流的節省是非常可觀的,一般可以達到30%之多;當然不同場景復雜度的碼流節省效果不一樣。

二、又拍雲窄帶高清轉碼實現

技術分享圖片

下面介紹又拍雲“窄帶高清”是如何實現的。首先輸入一個視頻轉碼的分片,接著進行復雜度分析,然後分場景轉碼參數,比如運動緩慢還是劇烈,當然這其中還會有碼率控制的算法來調整編碼器的輸出,最終得到編碼後的視頻。

1、復雜度分析

關於復雜度分析,我們是借鑒了標準裏面的 BT1788 關於空間感知信息和時間感知信息。空間感知信息是每一幀圖像做一個 Sobel 值,然後分析它的紋理的多少作為參考標準;時間感知信息是幀與幀之間的幀差做標準差,作為時間上的變化情況。

又拍雲根據用戶的應用場景不同一共分了四類場景:手機自拍、動畫、運動緩慢和運動劇烈。auto 是用戶不用選擇,我們會根據復雜度的分析自動選擇上面四個最合適的方法。為什麽需要進行場景分類呢?因為我們有的客戶的視頻源比較單一,比如一個客戶只有手機自拍的視頻,他就可以選擇視頻自拍。後面隨著業務越來越復雜,我們還會有更細的一些場景分類。

2、編碼器

a、H. 264 codec

技術分享圖片

優化編碼器參數——H.264 codec

上圖是 H.264 編碼器的框架, 其實 H.264 和 H.265 的編碼框架差不多,都是關於空間域和時間域的冗余壓縮。H.264 的框架流程包括了幀間、幀內的預測、變換、量化、反變換反量化、熵編碼和去方塊濾波,因為目前編碼標準都是基於“塊”的編碼,所以會出現“塊效應”,所以需要去方塊的濾波來提升人眼的主觀質量。

b、H.265編碼 codec

技術分享圖片

優化編碼器參數——H.265 codec

這個是 H.265 的編碼框架,與 H.264 一樣的混合編碼框架。比如包括了幀間、幀內的預測、熵編碼等,Deblocking 為了去除“塊效應",增加了一個新的 SAO 的濾波來消除振鈴效應。

c、H.264 與 H.265 參數對比

關於 H.264 和 H.265 框架,雖然說他們的流程基本一樣,框架也沒有變化,但是他們“處處相同又處處不同”,在每個技術上都做了優化。

第一,H.264 塊的尺寸是從 16x16 擴展到 H.265 的 64x64,這是一個指數級的塊的復雜度的提升;

第二,關於預測,H.265 幀內的預測方向提升到了 35 種。因為 H.265 是針對高清的,包括 1080P、2K、4K,最高到 8K,這種圖片的尺寸會比較大,所以它可以分大塊,對於那些變化不明顯的大塊圖像區域,可以用更大的塊尺寸,可以在預測環節減少分塊帶來的復雜計算。對運動矢量也做了優化,並且對亮度和色度差值算法變的更復雜;

第三,加入並行計算,因為復雜度提升了很多,而且目前計算機行業的並行技術發展的也很好,所以在視頻編碼標準制定的時候加入了並行的優化,來節省編碼時間。

d、H.265 編參數優化

技術分享圖片

H.265 編碼參數優化

不管是 H.264 還是 H.265,他們的編碼參數有幾十甚至上百個,那麽該如何設置呢?我們需要理論上去分析它在哪些環節花費時間比較長,然後在這些環節上做參數優化。

首先是幀間,因為現在都是基於塊的,如果塊預測準確,前後幀可能是完全一樣的,這時候編碼的比特就是 0 ;但是如果預測的不準確,它們做差異的時候可能會是一個很大的值,這樣編碼後的碼率就會大,所以幀間預測的準確程度也決定了碼率能節省多少。但是如果窮盡搜索或者全搜索的情況下,計算量會非常龐大。所以幀間預測的因素包括了運動搜索的算法、運動搜索的範圍等。

目前我們的編碼幀類型有 I 幀,P 幀,B 幀。B 幀包括被參考的 B 幀和無參考的 B 幀,I 幀理論說應該占比較多的比特,這樣對於視頻質量影響比較好一點,P 幀是前向參考,所以是其次大小,然後是有參考的 B 幀,無參考的B幀最小,是可有可無的存在。這種在做實時流的時候比較明顯,你如果丟了 I 幀,相當於一個 GOP 的幀都無法解出來,全部都要丟掉,會出現錯誤擴散。

視頻後處理,包括了去方塊濾波、樣點自適應補償(SAO),會比較好的提升視頻圖像質量。並行計算的技術影響會比較大,此外還有碼率控制和匯編優化。

3、碼率控制算法

碼率控制是在視頻編碼標準規定之外的,作用於編碼器,是基於反饋機制來調節編碼器的碼流輸出。比如當輸出的時候,帶寬突然變小,但是你還是按照現在碼流的輸出質量,它肯定會丟,這樣會反饋到編碼器,可以減少碼流輸出;如果帶寬變好了,也會反饋到編碼器上,輸出更高質量的碼流。

碼率控制在學術上分為兩類,一種是 CBR ,恒定的碼率,另一種叫 VBR ,可變的碼率,但是在實際應用的時候會有一些變化。碼率控制會根據不同的應用場景會有一些變化,比如本地文件或者針對流,碼率控制的策略都不一樣。針對流肯定是用 CBR ,但是它會存在浪費帶寬的情況,質量不會是最好的。

關於具體的碼率控制的模式,比如恒定的 CQP 量化參數來進行編碼,這個基本是用來做學術研究,驗證編碼器質量的好壞,它的好處是比較快,可以更好的鑒定編碼器的情況; 平均的 ABR 的碼率是 vbr 的一種;CBR ,它會設置一個固定碼率大小,因為在流媒體應用領域,一個帶寬的多少會有固定的值,比如最高不能突破 2 M ,所以這種方式會用;N-pass ,比如 2-pass 碼率控制方式,因為需要兩遍編碼,只能應用在實時性不強的情形,他會碼率控制的更準確,但是因為需要兩遍所以時間消耗比較多;CRF 的原理和 CQP 類似, 但是這種考慮了運動緩慢或者運動劇烈的情況下所需要的碼率不一樣,做了一些碼率的優化分配的方式;VBV 這個是一個緩沖池,因為碼流控制是基於一個反饋機制的,所以也是需要緩沖池的機制來保證。

技術分享圖片

窄帶高清碼率上限限制

窄帶高清有碼率上限限制,在不同分辨率的情況下,又拍雲保證在這個碼率下可以獲得最好的視頻質量。詳情參考:

窄帶高清轉碼技術實踐——技術沙龍分享實錄