VR應用在直播領域上的實踐與探索
宣告:本文來自「七牛雲主辦的架構師實踐日——泛娛樂+直播技術最佳實踐」的演講內容整理。PPT、速記和現場演講視訊等參見“七牛架構師實踐日”官網。
嘉賓:孫其瑞,得圖網路CTO。
責編:錢曙光,關注架構和演算法領域,尋求報導或者投稿請發郵件qianshg@csdn.net,另有「CSDN 高階架構師群」,內有諸多知名網際網路公司的大牛架構師,歡迎架構師加微信qshuguang2008申請入群,備註姓名+公司+職位。
與傳統的手機直播推流不同的是,VR直播推流往往存在多個採集端,且推流資料的位元速率遠遠高於傳統的手機直播,這給VR直播的技術實現帶來了一系列挑戰。對此,孫其瑞結合多年VR行業從業經驗,主要分享了VR實時推流的架構與實踐。以下為正文:
VR實時推流的架構與實踐
圖1是VR直播流程。與傳統的手機直播推流不同的是,VR推流可能存在多個採集端,通常手機推流資料最多達到 1024P或者1080P,但在VR領域4K才剛剛起步。因為VR的展示跟普通的展示不一樣,它是非平面、360度的,所以會多一個拼接和展示環節。拼接環節會用顯示卡加速到得圖,然後分發到電腦、手機等各個終端,再做展示。這是VR直播與傳統的直播相比最主要的區別。
在VR實時視訊拼接中,最大的難點是速度而不是演算法,速度決定了演算法的優劣。視訊拼接的演算法一般會在顯示卡上完成(顯示卡程式設計,指的是GPU程式設計,與顯示卡的思維不一樣)。除了實時拼接上的難點,超4K直播的推流控制也是VR直播中的一大難點。
總結起來,在這個過程中主要遇到如下挑戰:
GPU快速處理優化;
來自網路的波動。4K直播對網路要求很高,網路波動時做4K直播,無法根據網路進行優化;
音視訊同步。VR直播時,視訊和音訊不一樣,視訊要把6路、8路或者是12路進行實時拼接,再加音訊口進行混合推流,這時會出現不對等現象。
如何做到實時拼接?
4路及以上的1920x1080/30fps實時處理。一般來說要達到1920×1080、30fps,會用3.0 HDMI介面;
CUDA 併發處理運算。CUDA 是專門針對顯示卡進行優化的;
硬編解碼。做 4K 的時候經常會遇到硬編碼,也是顯示卡編碼;
多種輸出格式,包括 SDI 切換臺、RTMP 流、HTC 眼鏡等。SDI 切換臺應用比較廣泛,比如春晚的時候,可能有 3-4 個機位是通過有 SDI 的介面輸出到切換臺,由切換臺選擇哪路流進行推流,所以 SDI 切換臺可以做視訊編輯,加字幕、文字等等。HTC 的眼鏡就是 PCVR 的眼鏡,眼鏡端在 PC 電腦上,拼接好的資料直接推到眼鏡上面,在直播的時候放一個一體機在這裡,使用者戴上 HTC 的眼鏡就可以在這裡漫遊一圈。
圖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為例,演示VR直播服務過程。得圖網是做VR直播硬體服務的公司,推流端有VR直播一體機,經常到七牛進行回撥、轉錄、統計、計費監控等。如果做VR直播、全景,可以呼叫得圖網開發者平臺的SDK。
在VR直播技術上做了以下優化措施:
- 實時轉錄。以蘋果手機為例,做實時轉錄是因為手機上面是HLS ,不能進行3D貼圖。轉錄推流上去的時候,每5分鐘轉錄成MP4,移動端播放的時候延時很大。
沉浸感視角。圖5是小行星沉浸式視角,看到這個圖片會覺得有視覺衝擊力,因為此時視場角脫離地球站在比較遠的地方。VR的原理就是演進和基變,所謂演進就是用一個凸鏡經過光線的反射產生不均勻的同心圓,所謂基變就是把理論上光線原本應該產生的位置找出來。做法就是靠棋盤格通過拍照,找出原本的位置,然後進行資料擬合,然後把基變彎曲的曲線拉直。
跨平臺VR漫遊配置。因為VR漫遊是純視覺的東西,語言很難表述清楚。這是一個flash漫遊系統,裡面有VR漫遊的做法,供大家參考。
編輯推薦:架構技術實踐系列文章(部分):
- 孫其瑞:VR應用在直播領域上的實踐與探索
- 劉丁:bilibili高併發實時彈幕系統的實戰之路
- 秦鵬:從應用到平臺,雲服務架構的演進過程
- 郭煒:從0到N建立高價效比的大資料平臺
- 李智慧:宅米網技術變遷——初創網際網路公司的技術發展之路
- 陶文質:分散式系統設計的求生之路
- 魏曉軍:React Native實踐之攜程Moles框架
- 學霸君姜波:耳目一新的線上答疑服務背後的核心技術
- 愛樂奇麥凱臻:線上教育的內容研發和技術的迭代創新
- 長虹李瑋:老牌消費電子企業如何擁抱Docker
- 徐漢彬:日請求過億的Web系統PHP7升級實踐
- 竇威:AcFun的視訊架構演化實踐
- 傅鴻城:QQ億級日活躍業務後臺核心技術揭祕
- 寧峰峰:尖峰日96萬訂單,59校園狂歡節技術架構剖析
- 樑陽鶴:每秒處理10萬訂單樂視集團支付架構
- 沈輝煌:億級日PV的魅族雲同步的核心協議與架構實踐
- 李任:攜程Docker最佳實踐
- 王海軍:遊戲研發與運營環境Docker化
- 史海峰:噹噹網高可用架構之道
- 黃哲鏗:應對電商大促峰值的九個方法
- 1號店交易系統架構如何向「高併發高可用」演進
- 京東閆國旗:從C10K到C10M高效能網路的探索與實踐
- 李林鋒:服務化架構的演進與實踐
- 1號店架構師王富平:一號店使用者畫像系統實踐
- 唯品會官華:實現電商平臺從業務到架構的治理體系
- 沈劍:58同城資料庫架構最佳實踐
- 荔枝FM架構師劉耀華:異地多活IDC機房架構
- UPYUN的雲CDN技術架構演進之路
- 初頁CTO丁樂:分散式以後還能敏捷嗎?
- 陳科:河狸家運維繫統監控系統的實現方案
- 途牛譚俊青:多資料中心狀態同步&兩地三中心的理論
- 雲運維的啟示與架構設計
- 魅族多機房部署方案
- 藝龍十萬級伺服器監控系統開發的架構和心得
- 京東商品詳情頁應對“雙11”大流量的技術實踐
- 架構師於小波:魅族實時訊息推送架構
相關文章
- 雲原生技術領域的探索與實踐
- vivo直播應用技術實踐與探索
- B站在實時音影片技術領域的探索與實踐
- EventBridge 在 SaaS 企業整合領域的探索與實踐
- 流批一體在 AI 核心電商領域的探索與實踐AI
- VR除了被用在色情行業中 vr運用領域還有哪些VR行業
- 螞蟻區塊鏈在司法存證領域的探索與實踐區塊鏈
- 大資料在電網領域的探索與實踐(報告PPT)大資料
- 人工智慧在財富領域的應用與探索人工智慧
- 雲資料庫在水利領域的應用與探索資料庫
- 【直播預告】Greenplum在運營商領域的HTAP實踐
- 鐳射雷達主要應用在哪些領域?
- Java培訓完可以應用在什麼領域Java
- 物聯網路卡可以應用在哪些領域
- Java學完可以應用在什麼領域?這8大領域你要知道Java
- 國產開源資料庫:騰訊雲TBase在分散式HTAP領域的探索與實踐資料庫分散式
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 開發篇SpringGCCloud
- 持續整合領域的智慧排程探索及實踐 - 黃佳鑫
- 宜信OCR技術探索與實踐|直播速記
- ClickHouse在大資料領域應用實踐大資料
- ChatGPT的探索與實踐ChatGPT
- 社交資料在徵信領域的應用探索
- 蘋果在AR VR領域的現狀與預測蘋果VR
- Flink 在人工智慧領域的應用實踐人工智慧
- 區塊鏈作用在哪些領域得以實現?區塊鏈
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(工具部署)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 高可用(熔斷)SpringGCCloud
- 領域驅動設計之實踐與反思
- Flutter探索與實踐Flutter
- Vue 探索與實踐Vue
- Serverless 在 SaaS 領域的最佳實踐Server
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 診斷(線上聯調)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 線上釋出(可灰度)SpringGCCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 — 部署篇(開發部署)SpringGCCloud
- Spring Cloud 應用在 Kubernetes 上的最佳實踐 — 高可用(混沌工程)SpringCloud
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(容量評估)SpringGCCloud
- 《探索Python Requests中的代理應用與實踐》Python
- 從研發域到量產域的自動駕駛工具鏈探索與實踐自動駕駛