999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

用于外接式HMD的全景視頻播放器軟件的設計與實現

2021-11-03 08:04:48李永亮黃滔
電子技術與軟件工程 2021年16期
關鍵詞:用戶

李永亮 黃滔

(中山職業技術學院藝術設計學院 廣東省中山市 528400)

1 引言

虛擬現實技術所具備的沉浸感、交互性、想象性和智能性4種特征[1],使之在教育、培訓和娛樂等領域具有相當高的應用價值[2],特別是在消費級頭戴式顯示設備(HMD,Head Mounted Displayer)以及全景攝像設備相繼問世以來,虛擬現實技術進入大眾生活的趨勢愈加明顯,其中文化娛樂是虛擬現實技術在大眾生活中發揮作用的重要領域[3],而借助HMD 欣賞360 度全景視頻是較為常見的一種娛樂方式。從用戶體驗的角度看,利用HMD 播放360 度全景視頻的效果要求有較高的流暢度和清晰度,如果播放直播視頻則對低延時性也有較高的要求,因此該項應用對設備的計算能力、顯示能力和網絡帶寬都有較高的要求。

HMD 按照其系統構成形式可分為外接式、外殼式和一體式三種[4]。外接式HMD 需要與外部主機(主要是PC 機)相連接,本身不包含主要計算能力,僅包含顯示系統與傳感系統。而外殼式HMD 不具有顯示和計算系統,僅具有光學系統,有些也具有傳感系統,需要通過與智能手機等智能終端結合實現完整的功能。一體式HMD 則是將顯示、傳感和計算等系統集成在一起的設備。從設備的系統構成可以看出,由于外接式HMD 可以充分借助PC 機的計算能力(包括CPU 和顯卡)和網絡帶寬,因此較為適合用于播放360 度全景視頻,特別是流媒體形式的直播視頻。

本文以libVLC 為基礎,以三維引擎Unity 為開發工具,C#為編程語言,設計和實現了一款用于外接式HMD 的流媒體播放器軟件,利用本軟件用戶可以沉浸式的觀看以流媒體方式在網絡上推送的全景視頻和全景攝像機的直播畫面,用戶可以通過PC 端的窗口設置流媒體的地址、畫面尺寸相關參數以及校正默認觀看角度,并在佩戴HMD 設備后獲得沉浸式的360 度全景觀看效果。

2 系統設計

2.1 系統構成

本軟件的系統構成如圖 1所示,其中libVLC 為VideoLAN 項目組開源的VLC media player 播放器軟件的內核引擎及其接口,開發者利用libVLC 可以開發任何基于VLC 架構的多媒體應用程序[5]。由于libVLC 是由C 語言開發的,為了使之能夠與Unity 引擎兼容,本文設計了VLCNativeMethod 類,利用C#的DllImport 特性將libVLC 中常用的方法引入到VLCNativeMethod 類中,從而為在Unity C#腳本中使用libVLC 的功能創造了條件。而VLCUnity 模塊則為一個典型的Unity C#腳本組件類,它是對VLCNativeMethod類的進一步封裝,提供了創建VLC 實例對象、創建播放器對象、指定提取視頻畫面回調函數、播放媒體資源、設置視頻畫面規格、暫停播放和停止播放等功能。VLCUnityPlayer 也是一個Unity C#腳本組件類,其本質上是構造了一個在Unity 引擎中使用的播放器組件,該組件有兩大主要功能,其一為實現用戶的操作意圖,包括設置媒體資源、播放、暫停和停止等,其二為在虛擬場景中渲染視頻畫面,在渲染之前還需要對視頻的畫面進行幀同步以保證每一幀畫面的渲染順序是正確的。FrameBuffer 類即為用于實現幀同步的視頻畫面數據緩沖區管理類,該類提供了實現幀同步的相關方法,包括讀、寫緩沖區以及設置緩沖區狀態的方法。CameraRigRotate則用于在播放360 度全景視頻的過程中,調整用戶視角的方位角和翻滾角。而UIManager 則為人機交互接口管理組件,用于將UI 界面上的控件與VLCUnityPlayer 組件以及CameraRigRotate 組件的功能進行關聯。

圖1:系統構成

2.2 視頻資源播放流程

本系統在VLCUnityPlayer 組件的控制下實現視頻資源的播放,具體流程如圖 2所示。其中,視頻URL 和畫面規格通過UIManager 組件從用戶界面上獲取。VLC 實例、播放器實例以及播放控制通過VLCUnity 組件實現。而畫面的渲染則通過將畫面提取回調函數中獲得的視頻畫面數據復制到目標材質的貼圖中實現,目標材質事先已經設置為虛擬場景的天空盒材質從而保證視頻畫面以360 度全景的形式展現。

圖2:視頻資源播放流程

3 關鍵技術

3.1 畫面幀同步

由于在視頻播放過程中,libVLC 模塊逐幀提取視頻畫面的過程與Unity 引擎的畫面渲染過程是相互獨立的,刷新頻率各不相同,因此如何在Unity 引擎中進行視頻畫面的幀同步從而保證視頻畫面在場景中有正確的渲染順序是需要解決的一個關鍵技術問題。

通過libVLC 模塊逐幀提取視頻畫面是通過VideoLockCB、VideoUnlockCB 和VideoDisplayCB 三個回調函數實現的。 當libVLC 模塊將要提取新的一幀視頻畫面數據時VideoLockCB 函數被調用,在該函數中要創建并指定視頻畫面數據的緩沖區,從而保證新的視頻畫面幀數據被寫入緩沖區中。當VideoLockCB 函數執行完畢后,libVLC 模塊開始向緩沖區寫入視頻畫面幀數據,當寫入操作完成后VideoUnlockCB 函數會被調用,在該函數中可以從緩沖區中獲取視頻畫面幀數據。隨后VideoDisplayCB 函數會被調用,在該函數中可以將視頻畫面幀數據渲染到指定位置。在普通的應用程序中,只要設置一個視頻畫面幀數據緩沖區,并在VideoDisplayCB 函數中更新畫面顯示內容即可實現畫面的播放,此時畫面的更新頻率取決于libVLC 模塊提取視頻畫面的頻率。然而在本系統中,視頻畫面的渲染由Unity 引擎控制,Unity 的畫面幀率是不固定的并且其刷新過程與libVLC 模塊提取視頻畫面的過程完全獨立,因此造成了視頻畫面數據的獲取與渲染不同步的情況。如果不進行幀同步處理,當渲染速度比獲取速度快時,會導致緩存區中未寫入完成的畫面數據被渲染到場景中從而造成大量非正常的殘缺畫面;而當渲染速度比獲取速度慢時,又會導致部分畫面無法被渲染出來從而造成丟幀。

本系統通過VLCUnityPlayer 組件協調libVLC 模塊和緩沖區管理類FrameBuffer 來解決幀同步問題。其中FrameBuffer 類采用了讀、寫雙緩沖區隊列的方法來保證每個視頻畫面幀的渲染順序是正確的,原理如圖 3所示。在最開始時緩沖區都在寫隊列中,借助隊列所具有的先入先出的特點,在每次從libVLC 模塊獲取幀畫面數據時,首先從寫隊列中取出一個緩沖區并由libVLC 模塊將幀畫面數據寫入該緩沖區,然后將該緩沖區放入讀隊列中,而當需要渲染視頻畫面時則從讀隊列中取出最早放入隊列的緩沖區,將其中的數據渲染到目標材質后再將該緩沖區放入寫隊列中。重復上述過程,從而在緩沖區數量足夠多的情況下,能夠保證視頻畫面的每一幀都會按照視頻中原本的順序被渲染到目標材質中。

圖3:采用讀寫雙緩沖區隊列實現幀同步的原理

幀同步過程的泳道圖如圖 4所示,由圖可知當渲染畫面的速度較獲取畫面數據的速度慢時會造成寫緩沖區耗盡,從節約內存資源的角度考慮本系統選擇不擴充緩沖區的數量,而是提供一個棄幀緩沖區給libVLC用于保障運行流程順暢但放棄該幀數據不進行渲染。通過實驗,在HMD 為HTC VIVE,PC 機條件如下:CPU 為Intel Core i7,GPU 為NVIDIA GeForce GTX 1080,內存容量64 GB ,操作系統為Windows10 時,緩沖區個數設置為4 就已經能夠保證長時間播放像素寬度為3008、像素高度為1504 的360 度全景視頻而不出現緩沖區耗盡的情況。

圖4:實現幀同步的泳道圖

3.2 畫面的渲染

從libVLC 獲取的視頻畫面雖然是全景畫面,但是在媒體資源中其存儲形式是二維平面,為了使之在用戶身處的虛擬場景中呈現360 度的沉浸式效果,需要將二維畫面映射成立體球面。在Unity引擎所構造的虛擬場景中有天空盒的概念,其本質是以360 度全景的形式呈現場景背景畫面的一種特殊材質,因此只要將全景畫面的紋理復制到天空盒材質的渲染紋理上,即可實現二維平面到立體球面的映射。具體實現方法分為虛擬場景中天空盒材質相關的設置和運行時對天空盒材質的主貼圖紋理進行更新兩部分,流程示例如圖5所示。

圖5:視頻全景圖像渲染的示例流程

在虛擬場景的設置中,需要創建播放全景視頻專用的材質,該材質采用的Shader 為Skybox 分類下的Panoramic。并且由于全景畫面映射到天空盒的立體球面上之后畫面是上下顛倒的,因此還需要將場景中的主攝像機進行180 度的翻滾,即圍繞自身坐標系Z 軸正向旋轉180 度。其次,在VLCUnityPlayer 組件中,根據視頻畫面的提取規格(包括像素寬度、像素高度、色彩編碼)創建一個渲染貼圖(RenderTexture)對象,并將其設置為全景視頻專用材質的主貼圖,同時要創建一個二維貼圖(Texture2D)對象作為從緩沖區獲取畫面數據的中介。當播放視頻時,每從緩沖區讀隊列獲取一幀畫面數據,便使用緩沖區中的數據更新二維貼圖對象,再使用Unity 引擎 Graphics 類的靜態方法 Blit(Texture,RenderTexture)將二維貼圖上的紋理數據復制到天空盒材質的渲染貼圖上,從而實現全景二維畫面到立體球面畫面的映射。

3.3 視角控制

在全景視頻播放過程中,可能會出現視頻拍攝的視角與觀眾視角不匹配的情況,特別是拍攝視角處于移動狀態的時候,移動的方向與用戶視角默認的前方(即視頻開始播放時用戶視角在虛擬場景中的正前方)不一致的情況下,會給用戶帶來不適感,甚至可能導致動暈癥。此外當視頻數據的來源是全景攝像機的直播推流時,如果全景攝像機的擺放不平整并且沒有對畫面的傾斜進行修正,則全景視頻播放器中呈現的畫面將會持續的傾斜,同樣會給觀看體驗帶來負面影響。

為了解決上述問題,本系統設計了CameraRigRotate 組件用于實現在播放過程中調整用戶視角方位角和翻滾角的功能。通過向用戶提供方位角調整的功能可以解決運動過程中拍攝視角和觀看視角不匹配的問題,而通過提供翻滾角調整的功能則可以解決畫面傾斜的問題。

在Unity 場景中以CameraRig 對象代表用戶視角,方位角表示CameraRig 對象相對其默認姿態圍繞世界坐標系Y 軸旋轉的角度,而翻滾角則表示CameraRig 對象相對其默認姿態圍繞自身坐標系Z軸旋轉的角度。CameraRigRotate 組件具有SetRotation(float,float)和ResetRotation()兩個函數,分別用于更新用戶視角和恢復默認視角。其中SetRotation(float,float)的第一個形參表示方位角的值,第二個形參表示翻滾角的值,該函數被調用時用戶視角的主攝像機對象將會按照參數值更新其在虛擬場景中的姿態,從而實現用戶視角的調整。而當ResetRotation()函數被調用時則用戶視角會恢復到默認狀態。

利用Unity 事件機制,將CameraRigRotate 組件的SetRotation(float,float)函數設置為UI 界面上水平滑動條和垂直滑動條OnValueChanged 事件的回調函數,同時也設置為HMD 設備手柄用戶輸入事件的回調函數。對ResetRotation()函數也做類似的設置,從而保證用戶可以同時使用UI 界面和手柄來調整用戶視角。

4 效果展示

進入系統后,PC 端窗口全屏顯示,并且其操作界面默認為隱藏狀態,按下鍵盤上的空格鍵可以使操作界面在隱藏和顯示狀態之間切換。當操作界面隱藏時,窗口顯示流媒體中用戶可見部分的視頻畫面,當操作界面顯示后的狀態如圖 6所示,其中steam path 輸入框用于輸入視頻資源的URL,Width 和Height 輸入框用于輸入提取視頻畫面的像素寬度和高度,用戶單擊OK 按鈕可以開始播放視頻并隱藏界面控件,水平和垂直滑動條則用于在播放過程中調整用戶視角的方位角和翻滾角,如果單擊Reset 按鈕則用戶視角會恢復到默認狀態。

圖6:PC 端界面展示

視頻完整的全景畫面與用戶在佩戴HMD 后的視角畫面之間的對比如圖 7所示,可以看出用戶的體驗是完全沉浸式的,就如同身處視頻拍攝的場景當中。

圖7:全景畫面與玩家視角效果對比

5 總結

本文提出了一種用于外接式HMD 設備的360 度全景視頻播放器軟件的設計與實現方法,該軟件以URL 的方式定位視頻資源,既可以播放PC 機本地的視頻也可以播放通過網絡推流的流媒體視頻,為使用外接式HMD 的用戶提供了一種沉浸式觀看360 度全景視頻和直播的手段。本系統結合視頻的拍攝設備以及直播推流技術,可以在文化娛樂和培訓教育等領域提供一種基于沉浸式360 度全景視頻的解決方案。

猜你喜歡
用戶
雅閣國內用戶交付突破300萬輛
車主之友(2022年4期)2022-08-27 00:58:26
您撥打的用戶已戀愛,請稍后再哭
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年5期)2016-11-28 09:55:15
兩新黨建新媒體用戶與全網新媒體用戶之間有何差別
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
挖掘用戶需求尖端科技應用
Camera360:拍出5億用戶
創業家(2015年10期)2015-02-27 07:55:08
100萬用戶
創業家(2015年10期)2015-02-27 07:54:39
主站蜘蛛池模板: 久久综合九色综合97网| 国产精品网址在线观看你懂的| 中文国产成人精品久久一| 99re在线视频观看| 国产色婷婷| 日韩在线中文| 精品夜恋影院亚洲欧洲| 高清欧美性猛交XXXX黑人猛交| 久久91精品牛牛| 国产精品蜜芽在线观看| 欧美日韩精品一区二区视频| 在线视频97| 久久久久亚洲av成人网人人软件| 99久久精彩视频| 国产微拍精品| 99九九成人免费视频精品| 久久综合亚洲色一区二区三区| 极品av一区二区| 国产青榴视频| 区国产精品搜索视频| 国产爽妇精品| 国模沟沟一区二区三区| 精品人妻一区二区三区蜜桃AⅤ| 國產尤物AV尤物在線觀看| 欧美日韩另类国产| 99热国产这里只有精品9九| 国产综合精品日本亚洲777| 亚洲第一中文字幕| 在线一级毛片| 欧美性猛交xxxx乱大交极品| 日本不卡在线| 2020最新国产精品视频| 波多野结衣无码AV在线| 久久久久久国产精品mv| 欧美亚洲第一页| 国内毛片视频| 国产成人AV大片大片在线播放 | 2021国产v亚洲v天堂无码| 蜜桃视频一区| 日韩视频精品在线| 欧美亚洲国产精品第一页| 欧美翘臀一区二区三区| 91精品专区国产盗摄| 依依成人精品无v国产| 天天躁狠狠躁| 9999在线视频| 午夜不卡视频| 亚洲一区毛片| 日韩欧美国产中文| 中日无码在线观看| 国产成人在线无码免费视频| 亚洲高清在线天堂精品| 久久久久亚洲AV成人网站软件| 亚洲色精品国产一区二区三区| 在线观看精品国产入口| 全裸无码专区| 成人午夜视频在线| 亚洲色图另类| 亚洲国产午夜精华无码福利| 国产高清在线观看91精品| 欧美一级99在线观看国产| 欧美五月婷婷| 欧美成人日韩| 丝袜国产一区| 欧美高清三区| 色综合久久无码网| 欧洲熟妇精品视频| 国产色网站| 日本少妇又色又爽又高潮| 黄色免费在线网址| 五月激情婷婷综合| 亚洲综合久久成人AV| 亚洲男人在线天堂| 亚洲国产日韩一区| 欧美黄网站免费观看| 成人日韩视频| 97国产精品视频自在拍| 精品91自产拍在线| 国产欧美日韩18| 视频在线观看一区二区| 国产亚洲精品无码专| 欧美另类图片视频无弹跳第一页|