VR應用在直播領域上的實踐與探索

錢曙光發表於2016-08-22

宣告:本文來自「七牛雲主辦的架構師實踐日——泛娛樂+直播技術最佳實踐」的演講內容整理。PPT、速記和現場演講視訊等參見“七牛架構師實踐日”官網。
嘉賓:孫其瑞,得圖網路CTO。
責編:錢曙光,關注架構和演算法領域,尋求報導或者投稿請發郵件qianshg@csdn.net,另有「CSDN 高階架構師群」,內有諸多知名網際網路公司的大牛架構師,歡迎架構師加微信qshuguang2008申請入群,備註姓名+公司+職位。

與傳統的手機直播推流不同的是,VR直播推流往往存在多個採集端,且推流資料的位元速率遠遠高於傳統的手機直播,這給VR直播的技術實現帶來了一系列挑戰。對此,孫其瑞結合多年VR行業從業經驗,主要分享了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碼流的要求等,也會影響秒開速度。

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

  1. 必須優化H.264的首幀,在遠端播放的時候,首次快取更多幀下來,就可以讓直播變得更流暢;

  2. I幀、B幀和P幀,一般的相機只有I幀或者是P幀,不會有B幀(B幀是一個動畫幀,影視裝置才有,普通的手機或者是硬體基本不會有),如果推流的時候有音視訊不同步,一般是視訊裡面插了一個B幀,因為多一個幀就多一個網路資料;

  3. 優化GOP資料,H.264裡面有一個這樣的資料;

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

多終端平臺VR播放及架構

圖片描述

圖 4

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

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

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

圖片描述

圖 5

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

  2. 跨平臺VR漫遊配置。因為VR漫遊是純視覺的東西,語言很難表述清楚。這是一個flash漫遊系統,裡面有VR漫遊的做法,供大家參考。

編輯推薦:架構技術實踐系列文章(部分):

相關文章