1. 程式人生 > >GLSurfaceView+openGL播放VR視訊/全景視訊(VR解碼器)

GLSurfaceView+openGL播放VR視訊/全景視訊(VR解碼器)

  OpenGL ES/SDL渲染,FFmpeg ;VR分屏之OpenGL-OpenGL ES來播放視訊.MediaPlayer+GLSurfaceView+openGL
 (推薦 )MD360 VR- https://github.com/ashqal/MD360Player4Android
  OpenGL ES用來繪製螢幕及分屏,FFmpeg用來音視訊編碼解碼等。
> OpenGL與Unity3D
 OpenGL 是一個相對底層的框架。會提供一系列函式框架作為 API 提供給開發者使用。OpenGL製作VR 播放器。
 Unity3D 是一個跨平臺的遊戲引擎。解決的是遊戲製作人通過什麼東西來做遊戲的問題。本身包含很多遊戲相關的功能,比如繪圖,播動畫,放音樂,聯網等等。
OpenGL是右手系,但是Unity和D3D卻是左手系(Unity在觀察座標系又是右手系) 

    OpenGL ES是在圖形影象中,非常優秀的渲染庫,既然是渲染,就那會和視訊離不開,早期是FFmpeg解碼視訊,用於顯示視訊是通過surfaceView。今天通過OpenGL+SurfaceTexure進行顯示視訊。
    OpenGL大量使用了向量和矩陣,矩陣的最重要的用途之一就是建立正交和透視投影。其原因之一是,從本質上來說,使用矩陣做投影只涉及對一組資料按順序執行大量的加法和乘法,這些運算在現代GPU上執行的非常快。

> Google VR
Android N VR程式碼簡析- https://www.jianshu.com/p/027916e345bc
  Google單獨分離出一個SDK,除了方便應用開發者之外,主要的目的是用來把VR的一些核心演算法隱藏起來,比如用來減少延遲的ATW非同步時間扭曲演算法就是被封裝在這裡.手機上面執行VR的時候一個最大的挑戰就是延遲,當一副畫面的延遲超過20MS,人就會感覺不舒服噁心,嚴重影響使用者體驗,一個好的VR產品都會盡量避免延遲。.
  Google VR SDK應該是解決了ATW演算法和多解析度渲染等優化問題,然後新增了一個系統服務VrManagerService和 vr HAL層, 應用通過VrManagerService來設定系統進入VR模式,VrManagerService又是通過vr HAL層去實現具體模式的切換的。
  VR全景圖+Opengl3D模型展示- https://github.com/DrownCoder/VRShow
Google VR研究,發現它閉源 可定製的東西比較少,可以捨棄它了

翻牆看google VR 官方文件:https://developers.google.com/vr/android/  https://developers.google.com/vr/android/reference_overview
https://github.com/googlevr/gvr-android-sdk.git  https://github.com/ejeinc/RajawaliCardboardExample cardboard的demo

谷歌google vr demo- http://download.csdn.net/detail/zph1596946/9543674
http://www.androidauthority.com/developing-with-the-google-vr-sdk-and-ndk-699472/
  Google provides developers with two virtual reality (VR) platforms: Cardboard, the world's most popular and accessible mobile VR platform, and Daydream, a new platform for low-latency, immersive, and interactive mobile VR.
  A physical Android device running Android 4.4 (KitKat) or higher for Cardboard apps or a Daydream Ready phone
  Both of these samples are single activity applications that display an embedded panoramic image or video using VrPanoramaView and VrVideoView, respectively.

-- 利用 Google Cardboard 及 Rajawali 3D 開發的VR播放器- https://github.com/substarry/VRPlayer
EXOplayer,做個視訊的都知道,這個專案也是Google開源的,對流媒體很好的支援。

> VR技術
-- VR 核心技術體現在以下幾個方面:
 1.全立體顯示(3D 顯示):包括反畸變演算法、多影象處理
 2.運動追蹤:利用陀螺儀 GyroscopeSensor 加速度計 G-Sensor 等來感應我們身體移動和頭部轉動
 3.輸入裝置:觸控板、手柄、無線體感裝置、手勢識別
  利用手柄的典型方案比如 HTC 的 Vive、Sony 的 PS VR;
  無線體感裝置比如 雷射的 Hydra、Sixense 的 STEM;
  手勢識別感應裝置比如 Leap Motion 和 Nimble VR;
  具體哪種方式會成為未來 VR 的 “滑鼠” 暫時還不明朗。
 4.開發工具:OpenGL 提供的 API、Unity3D 引擎 等;

-- VR技術主要從以下方面入手:
SDK層:主要目的是提高影象質量,降低影象延時。
Framework層:主要對聲音和圖形影象,功耗進行優化。
底層:提高GPU影象渲染速度和DSP資料運算速度,實現低延時。


-- VR視訊播放器最起碼有這些基本功能:
全景360度無死角,支援陀螺儀感應和手動拖動瀏覽視訊。支援螢幕型別切換,支援單屏、雙屏等。
FFmpeg在點播視訊和VR視訊中的運用。

> 得圖VR
  得圖致力於降低VR影像製作成本,提供了從硬體,到軟體,再到完整的行業應用方案。包含了直播軟體,拼接軟體,雲製作服務、SDK等免費服務,為VR影像生產提供了完備的生產工具。
  得圖VR PanoPlayer Android版SDK使用指南- http://www.detu.com/develop/page/42

> VR xl_player - https://github.com/xl-player-developers/xl_player,
iOS VR HTY360Player- https://github.com/hanton/HTY360Player   https://github.com/libobjc/SGPlayer
Linux下,CMakeLists.txt及Cpp資料夾在每個module下都有軟連結,在Windows下不支援,各自拷貝一份到相應的Module下。(跨平臺問題)

Android捕捉影象後在SurfaceView上變形顯示問題的處理- http://www.cnblogs.com/chenjianxiang/p/4168203.html
 SurfaceView是檢視(View)的繼承類,這個視圖裡內嵌了一個專門用於繪製的Surface。你可以控制這個Surface的格式和尺寸。Surfaceview控制這個Surface的繪製位置。surface是縱深排序(Z-ordered)的,這表明它總在自己所在視窗的後面。surfaceview變得可見時,surface被建立;surfaceview隱藏前,surface被銷燬。這樣能節省資源。如果你要檢視 surface被建立和銷燬的時機,可以過載surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
  整個過程:繼承SurfaceView並實現SurfaceHolder.Callback介面 ----> SurfaceView.getHolder()獲得SurfaceHolder物件 ---->SurfaceHolder.addCallback(callback)添加回調函式----
 SurfaceHolder.lockCanvas()獲得Canvas物件並鎖定畫布----> Canvas繪畫 ----
 SurfaceHolder.unlockCanvasAndPost(Canvas canvas)結束鎖定畫圖,並提交改變,將圖形顯示。

 如何手動銷燬surfaceview 並重建- 很簡單  將其設為View.GONE  再將其設為View.visable。
 Android有關surfaceView重新建立的問題- 解鎖屏之後,surfaceview就會自動重新建立,所以,只需在重新建立之後恢復到以前的狀態就可以了。
 關於Activity與SurfaceView的生命週期  。
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
    if (mCurrentPreviewState == USB_PREVIEW) {
        rect.set(IMG_WIDTH / 2, IMG_HEIGHT / 2, IMG_WIDTH, IMG_HEIGHT);
        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
        canvas.drawBitmap(mPreviewBitmap, null, rect, null);
    } else {
        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
        canvas.drawBitmap(mPreviewBitmap, null, rect, null);
    }                   
    getHolder().unlockCanvasAndPost(canvas);
}

> 其他VR
Android-VR 支援流媒體- http://blog.csdn.net/honjane/article/details/51884424
VR-- https://github.com/wheat7/VRPlayer 
VR Android播放器實現(二)- http://blog.csdn.net/hebeixmg/article/details/52598902
NitroAction360- https://github.com/Nitro888/NitroAction360  https://github.com/hanton/HTY360Player
vrVideo- https://github.com/pondurii/vrVideo
OpenGL ES_手把手教你打造VR全景播- http://www.jianshu.com/p/0f740901da59
android opengl播放全景視訊- https://www.jianshu.com/p/254837f663c4
android使用opengl es2.0播放VR視訊- https://www.jianshu.com/p/b80d70a2b9f4
GLSurfaceView VR視訊- https://github.com/Martin20150405/Pano360
openGL ES進階教程(五)製作一個簡單的VR播放器,播放全景視訊- https://blog.csdn.net/king1425/article/details/76558737
OpenGL從零開始寫一個Android平臺下的全景視訊播放器——目錄- https://blog.csdn.net/Martin20150405/article/details/53149578
從零開始打造一個VR視訊播放器-VRPlayer原始碼分析- http://www.jianshu.com/p/c7a3b1acb8b1
如何做個VR播放器- http://www.gad.qq.com/article/detail/25937#
從零開始寫一個Android平臺下的全景視訊播放器——3.2 使用OpenGL ES 2.0繪製一個球- http://blog.csdn.net/martin20150405/article/details/53888204
[OpenGL]從零開始寫一個Android平臺下的全景視訊播放器- http://blog.csdn.net/Martin20150405/article/category/6274984
Android全景視訊播放器 原始碼- http://download.csdn.net/detail/martin20150405/9681440
Pano360- https://github.com/Martin20150405/Pano360

UtoVR SDK
Facebook surround360 VR,Facebook有一個開源庫叫transform

VRPlayer is a simple but powerful local VR video player- https://github.com/wheat7/VRPlayer

> Unity 3D VR
Unity3D官方VR的Demo:https://unity3d.com/cn/learn/tutorials/topics/virtual-reality
Unity3D全景視訊播放AVPro Video外掛- http://download.csdn.net/download/java886o/9592531