標籤:

VR 應用在直播領域上的實踐與探索 | 架構師實踐日

編者按:與傳統的手機直播推流不同的是, VR 直播推流往往存在多個採集端,且推流數據的碼率遠遠高於傳統的手機直播,這給 VR 直播的技術實現帶來了一系列挑戰。針對這些挑戰,7 月 31 日,在七牛雲主辦的架構師實踐日上,得圖網路 CTO 孫其瑞結合多年 VR 行業從業經驗,帶來了「VR 應用在直播領域上實踐與探索」。以下是對他演講內容的整理。

孫其瑞,得圖網路 CTO。2012 年以前從事網遊 3D 引擎開發以及遊戲支付、電商平台工作。 2012 年後轉向 VR 領域,擅長圖形圖像演算法、音視頻編解碼以及分散式架構。

VR 實時推流的架構與實踐

圖 1

圖 1 是 VR 直播流程。與傳統的手機直播推流不同的是,VR 推流可能存在多個採集端,通常手機推流數據最多達到 1024P 或者 1080P,但在 VR 領域 4K 才剛剛起步。因為 VR 的展示跟普通的展示不一樣,它是非平面、360 度的,所以會多一個拼接和展示環節。拼接環節會用顯卡加速到得圖,然後分發到電腦、手機等各個終端,再做展示。這是 VR 直播與傳統的直播相比最主要的區別。

在 VR 實時視頻拼接中,最大的難點是速度而不是演算法,速度決定了演算法的優劣。視頻拼接的演算法一般會在顯卡上完成(顯卡編程,指的是 GPU 編程,與顯卡的思維不一樣)。除了實時拼接上的難點,超 4K 直播的推流控制也是 VR 直播中的一大難點。

總結起來,在這個過程中主要遇到如下挑戰:

  1. GPU 快速處理優化。
  2. 來自網路的波動。4K 直播對網路要求很高,網路波動時做 4K 直播,無法根據網路進行優化。
  3. 音視頻同步。VR 直播時,視頻和音頻不一樣,視頻要把 6 路、8 路或者是 12 路進行實時拼接,再加音頻口進行混合推流,這時會出現不對等現象。

圖 2

如何做到實時拼接?

  1. 4 路及以上的 1920x1080/30fps 實時處理。一般來說要達到 1920×1080、30fps ,會用 3.0 HDMI 介面。
  2. CUDA 並發處理運算。CUDA 是專門針對顯卡進行優化的。
  3. 硬編解碼。做 4K 的時候經常會遇到硬編碼,也是顯卡編碼。
  4. 多種輸出格式,包括 SDI 切換台、RTMP 流、HTC 眼鏡等。SDI 切換台應用比較廣泛,比如春晚的時候,可能有 3-4 個機位是通過有 SDI 的介面輸出到切換台,由切換台選擇哪路流進行推流,所以 SDI 切換台可以做視頻編輯,加字幕、文字等等。HTC 的眼鏡就是 PCVR 的眼鏡,眼鏡端在 PC 電腦上,拼接好的數據直接推到眼鏡上面,在直播的時候放一個一體機在這裡,用戶戴上 HTC 的眼鏡就可以在這裡漫遊一圈。

圖 3

圖 3 是 CUDA 的架構圖,左邊是核數,核數決定 CUDA 的大小,比如 960P 有 1 千多的核,1080P 是 2800 多個核。目前,CPU 的發展基本到了一定瓶頸,但是 GPU 卻在每年翻倍發展。GPU 有自己的架構,有最基礎的網格,每個網格都有一個塊,每塊下面都有限制的數,所以用 GPU 運算做大數據處理最好。但 CUDA 在並行運算時會遇到坑:

第一個坑是 CPU 與顯卡的匯流排帶寬。這是一個硬性的標準,因為 CPU-GPU 有一個物理距離,是無法改變的。比如運算一張圖片,基本上有兩個 FOR 循環,但是在 GPU 裡面完全不同,GPU 要實現 2000 多個核同時計算,必須要防止越界,合理分配網路數據。訪問一個9×9 的圖片,讓每個塊裡面有 3 個像素,取的時候線程裡面有 3 個數據,都配合交叉取二維裡面的數據。再比如把兩張圖片從 CPU 拷到 GPU 裡面運算,分配的空間是兩個不連續的空間,這樣做對於 GPU 的運算很不友好。而且,把一張圖片通過內存拷貝到顯卡里的過程很耗時,必須進行優化處理,最好的優化方式就是把圖片變成一個連續的內存,一次性拷過去。

第二個坑是順序內存空間。GPU 編程很重要的一方面就是順序的對乘,比如將一個 1G 的文本要放到 GPU 裡面運算,首先要考慮的事情就是考量一下傳輸時間和計算時間,如果傳輸時間遠遠大於計算時間,用 GPU 運算就失去了意義。目前,傳輸帶寬最大限額是 2.5G ,超過這個值 GPU 運算不過來。但是傳輸時間是毫秒級開運算的,如果忽略掉傳輸時間,在 1080 顯卡同時計算一個矩陣相乘,GPU 至少是 CPU 百倍以上的速度。根據以往直播的經驗,把 CPU 關掉、把 GPU 打開,輸入進 30 幀輸出時都能保證 30 幀,所以 GPU 運算性能強大。

第三個坑是並行優化。通過 GPU 進行運算有很多坑,因為它的調試很麻煩,必須調用 CUDA 裡面的內核,通過 GPU 非同步複製的方式進行並行優化,過程往往很複雜。

如何做到高清碼率秒開?

做 4K 的時候,不僅要解決「秒開」問題,還要解決推流問題,因為首幀時間、大小等因素,直接影響最後秒開的速度。此外,編碼、帶寬、網路波動、4K 碼流的要求等,也會影響秒開速度。

做到高清碼流要做到以下幾點:

  • 必須優化 H.264 的首幀,在遠程播放的時候,首次緩存更多幀下來,就可以讓直播變得更流暢。

  • I 幀、B 幀 和 P 幀,一般的相機只有 I 幀或者是 P 幀,不會有B幀(B 幀是一個動畫幀,影視設備才有,普通的手機或者是硬體基本不會有),如果推流的時候有音視頻不同步,一般是視頻裡面插了一個 B 幀,因為多一個幀就多一個網路數據。

  • 優化 GOP 數據,H.264 裡面有一個這樣的數據。

  • 網路結點,因為推流對網路結點要求很高,做 VR 直播的時候要提前溝通好網路結點,看終端推流端到終端的延時大概要多久,然後優化網路結點。

多終端平台 VR 播放及架構

圖 4

以圖 4 為例,演示 VR 直播服務過程。得圖網是做 VR 直播硬體服務的公司,推流端有 VR 直播一體機,經常到七牛進行回調、轉錄、統計、計費監控等。如果做 VR 直播、全景,可以調用得圖網開發者平台的 SDK 。

在 VR 直播技術上做了以下優化措施:

實時轉錄

以蘋果手機為例,做實時轉錄是因為手機上面是 HLS ,不能進行 3D 貼圖。轉錄推流上去的時候,每 5 分鐘轉錄成 MP4 ,移動端播放的時候延時很大。

圖 5

沉浸感視角

圖 5 是小行星沉浸式視角,看到這個圖片會覺得有視覺衝擊力,因為此時視場角脫離地球站在比較遠的地方。VR 的原理就是演進和基變,所謂演進就是用一個凸鏡經過光線的反射產生不均勻的同心圓,所謂基變就是把理論上光線原本應該產生的位置找出來。做法就是靠棋盤格通過拍照,找出原本的位置,然後進行數據擬合,然後把基變彎曲的曲線拉直。

跨平台 VR 漫遊配置

因為 VR 漫遊是純視覺的東西,語言很難表述清楚。這是(https://github.com/suiqirui1987/DetuFlashVr)一個 flash 漫遊系統,裡面有 VR 漫遊的做法,供大家參考。


推薦閱讀:

ARM架構和MIPS架構以及X86架構的區別是什麼?
如何評價基於Volta架構的NVIDIA TITAN V?
雙十一絲般順滑體驗背後:阿里雲洛神網路虛擬化系統揭秘
如何畫架構圖?

TAG:直播 | 架构 |