卡馬克解釋VR視頻《Henry》5K版本背後的技術
文章相關引用及參考:oculus
解鎖更高視頻質量和視覺清晰度。
(映維網 2018年06月20日)今天的視頻編碼者受制於一系列的約束,包括顯示器解析度,視場和壓縮率等等。為了把完整的360度,60fps立體視場帶到沉浸式視頻,Oculus的首席技術官約翰·卡馬克實現了一種全新的視頻編碼技術,其可以解鎖更高視頻質量和視覺清晰度。在今天這篇文章中,卡馬克分享了更多關於這項技術的信息,以及《Henry》5K版本的製作故事。以下是映維網的具體整理。
如果你有興趣用現有的360度內容來測試這項實驗性工具和源播放器,你可以訪問Oculus開發者中心並下載SDK樣本。
1. 視頻瓶頸
在VR中播放傳統的「平面」視頻通常受制於顯示器的解析度。除非你擁有巨大的弧形虛擬屏幕,1280×720視頻已經略微超出了顯示器的解析度,至少在邊緣位置是這樣。我們需要更高解析度的屏幕才能真發揮出1080P高清內容。
沉浸式視頻是另一個問題。要播放360度60fps的立體視場視頻,你所需要的解析度要高於當前的視頻解碼器。
顯示器的角解析度沒有精確數字,因為觀影光學元件使其不均勻,但整個360度上的5120像素是一個很好的近似值。對於當前的VR頭顯而言,任何超過這個值的數字都只是浪費資源和造成混疊。
沉浸式視頻最常見的表現形式是「等量矩形」投影,其中球體將映射至寬高比是2:1的矩形。這是極點上像素使用效率低下的現象,諸如桶形或膨脹立方體等其他投影可以節省一定的成本,但只是百分之幾,不是整數因子。
對於立體視場,你需要為每隻眼睛都配上這個數字,因此所需的視頻總數為5120×5120,速度則是60fps或1500Mpps(像素/秒)。
當Gear VR在Note 4上亮相時,你可以以30fps或240Mpps解碼3840×2160視頻。如果你在全360度展開,解析度看起來很不錯,但運動並不平滑,而且沒有任何深度。如果你想要60fps和立體視場,你只有四分之一的解析度,而所造成的模糊將令人十分反感。
來到Galaxy S7這一代,視頻解碼器的性能翻了一番,達到了4K60或480Mpps,這是Oculus Go和最新三星手機的位置。然而,這仍然只是我們目標的三分之一。
如果你願意犧牲任何一個軸:只是180度而不是360度,只是30fps而不是60fps,或者只是單視場而不是立體視場,這時你只是差50%而已,實際上不算太糟糕。如果你犧牲兩個軸,你可以達到顯示質量的峰值,而且留有餘量:80度,30fps立體視場視頻是最直接的方式。大多數相機和工作流程仍無法提供最佳質量的像素,但如果你謹慎注意,或者使用計算機生成的圖像,我們仍有可能實現。
如果你要實現完整的立場視場,你需要以某種方式解碼視頻中對當前視圖而言非常重要的部分。
2. 基於視角的視頻
今天的VR頭顯大概有90度視場,所以你視圖只是整個球體的六分之一。如果你在一個立方體的中心,正好看著一張臉的中間,這時你將無法看到其他五張臉。
Oculus的視頻解碼器可以解碼三分之一的世界,而我們實際上只需要六分之一,所以應該有足夠的餘量,但這仍然有很多挑戰。
由於今天視頻壓縮的方式,你無法解碼它的任意一小部分。視頻序列被分解為「groups of pictures(畫面組)」或者說「gops」,並且只能在完整圖片或「關鍵幀」所在的邊界開始解碼。其餘幀是根據較早幀進行預測,這使得它們更小。大多數視頻點播系統都採用3到5秒的gops來實現不錯的壓縮比。對於1秒gops,關鍵幀將佔用大約25%的文件大小。對於二分之一秒gops,基本上文件的一半都是關鍵幀。
因為你無法立即改變正在解碼的內容,所以你需要對整個360度視圖進行低保真編碼,因為你可以在幾百毫秒內輕鬆地翻轉頭部90度。
Oculus最早的視點相關方法是製作視頻的20個單獨版本,而每個版本都專註於不同地方的細節。最初Oculus採用了「金字塔投影」,然後轉到「偏移立方體貼圖」。所有這些版本都存儲在伺服器上,隨著你環顧四周,VR客戶端將在它們之間進行切換。
gops是1秒,但從互聯網傳輸到傳統網路伺服器的額外開銷將令切換延遲變得更長,而幾乎所有人都會注意到它。你會看向一邊,而一切都會變得模糊,有時這會持續2秒或更長時間。
為每個視頻構建20個不同的版本有很大問題,而且對於將它們全部放在設備上,從而可以在本地播放而不是從伺服器進行流式傳輸而言,這是不切實際的做法。
其他麻煩事項是,任何重採樣都將不可避免地降低圖像質量。如果主視頻是以等量矩形的形式實現,即使其在理論上具有完全相同的像素密度,但將其轉換為立方體貼圖也會降低質量。
3. 新方案
目前方案中的關鍵折衷辦法是,在球體頂部和底部接受較低解析度。卡馬克這樣做的原因有幾個:
在觀看360度視頻時,大多數人抬頭看或低頭看的幅度不會太大。當然,你可以根據這一點稍微拓展開來,並且認為他們向左看或向右看的幅度同樣不會太大,而你最終將強烈地認同180度視頻,但360度仍然是一個增量值。
為了隱藏相機裝置,向下的方向通常是黑色。
對於3D 360度視頻,強烈建議導演避免觀眾仰視或俯視,因為你必須先減弱立體3D效果,然後才能看到極點和讓眼睛往後倒。
極點上的不均勻等距投影仍然可以為你提供一定的「額外」解析度,至少在一個軸上是如此,所以這個bug成為了某種特徵。
儘管如此,這實際上仍然是一種妥協,而有些視頻在這種格式下效果不佳。一個明顯的例子是當你把清晰分明的文字放在天花板或地板上時。作為交換,我們得到的結果是,垂搖角度的視點相關性足夠好,這使得系統的數據重複最小,所以這可以支持本地設備,而非僅僅只是大量的伺服器。
作為一個基礎層,整個5K主視頻將重新採樣為一個始終可用的2K×2K版本,所以即使你瞬間旋轉180度,你總是能看到一些可以意識到的內容。如果你看向天花板或地板,這就是你所能看到的版本。
關鍵的中心區域直接從5K×5k主視頻中進行裁剪,像素到像素,沒有重新採樣。Oculus將它們分成10個獨立的視頻文件,每個眼睛512×1024像素列,然後進行堆疊和置換,從而製成2048×512視頻條。
總文件大小與傳統的5K×5K編碼大致相同,因為跳過極點可以平衡額外的gop關鍵幀和額外的低細節副本。
播放引擎同時解碼四個視頻流:背景和當前視圖中心的三個視頻條。隨著你環顧四周,三個視頻條將在每個gop轉換點切換信號源。
我們知道用戶不喜歡下載大型應用程序,因此質量和尺寸之間存在比較緊張的關係。《Henry》是用H264編碼,CRF 22,半秒gops。如果是為電影節或線下平台準備,而卡馬克表示可以將編碼預載入到頭顯上,不會關心下載大小,會採用CRF 18,以及可能是四分之一秒gops。
當前的解決方案支持所有的編解碼器,而且這11個視頻中的每一個都是完全獨立。你可以使用h264,h265,VP9,或者甚至是MPEG-2(目前的工具只支持h264和h265)。理想情況下,卡馬克表示會一次解碼四個視頻條,而不是說三個,但視頻解碼器的系統軟體負載非常巨大,所以卡馬克對三個已經感到相當滿意。
這是導致視頻側向置換的原因。卡馬克尚未實現的方案是,做足夠的源碼級修改,把所有視頻條的樣本粘貼在一起,將其作為一個較大幀中的h264/h265「切片」,這樣視頻解碼器僅解碼一個較大的視頻,而不是三個或四個較小的視頻。這將會大大減少負載,而且如果需要,視頻條可以變得更窄,因為卡馬克表示他可以很容易地將十個「切片」粘貼在一起。卡馬克還沒有完成這個方案。
對於演示這項技術,《Henry》的表現非常好,幾乎所有的畫面都能以高細節呈現。儘管如此,它仍然不能代表絕對的質量瓶頸。《Henry》是在數年前的實時渲染限制之內開發而成,而360度視頻的捕捉是以非實時的速度完成,設計並使用最先進的離線工具進行渲染可實現更高的質量。
注意:儘管用於捕捉實況片段的多相機裝置鬍鬚能夠輸出非常高解析度的主視頻,但感測器和拼接立體視場主視頻之間的多級處理可能意味著,它們無法真正產生比4K高很多的值。
對於這項新技術而言,最常見的第一印象是「哇,好清晰呀。」,但對於這一切,背後還有其他微妙的貢獻力量。
要將解析度放在屏幕上的所有合適位置,Oculus將視頻片段放在VrApi層上,而不是繪製到傳統的眼睛緩衝區。無論你使用何種解析度,通過眼睛緩衝區的額外過濾步驟始終會降低質量。
對於在VR中直接紋理映射視頻,其提供的是線性過濾,而不需要你想要的sRGB過濾。對於低解析度的視頻而言,這並不重要,但當你採用諸如文本這樣的高解析度和高對比度元素時,這將產生非常大的差異。由於必須複製這些視頻條,然後將它們組裝成連續的區域,所以卡馬克也藉此機會採用了sRGB紋理。
幾乎所有的視頻播放器都會令視頻幀速率匹配音頻上的時間同步,從而導致視頻播放中出現卡頓,這在60 fps時尤為明顯。在這裡,卡馬克堅持為每個顯示幀準確地釋放一個視頻幀,而且細微地重新採樣音頻以保持同步。《Henry》沒有非常明顯地表現出這一點,但任何存在持續運動的畫面都可以從中受益。
Audio 360空間化音頻是在低延遲音頻快速路徑中按需完成,因此它的響應速度比默認實現要快得多,不會給音頻定位帶來明顯的延遲。
對於過去數年間製作的大量高端360度作品來說,我們一直以來都只能以糟糕的畫質來進行觀影,而要解鎖其塵封已久的真實質量,這樣的前景卡馬克表示感到非常興奮。現在是時候抹去它們身上的灰塵了。
文章《卡馬克解釋VR視頻《Henry》5K版本背後的技術》首發於 映維網。


TAG:映維VR |