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

  • 11
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 34
    评论
好的,我可以为你提供一个简单的GLSurfaceView和CameraX结合的示例代码,供参考: ```kotlin class CameraXGLSurfaceView(context: Context, attrs: AttributeSet?) : GLSurfaceView(context, attrs) { private val renderer: CameraXGLRenderer init { // 设置OpenGL版本 setEGLContextClientVersion(2) // 创建渲染器 renderer = CameraXGLRenderer(context) // 设置渲染器 setRenderer(renderer) // 设置渲染模式为连续模式 renderMode = RENDERMODE_CONTINUOUSLY } fun startCamera() { // 启动相机 renderer.startCamera() } fun stopCamera() { // 停止相机 renderer.stopCamera() } } class CameraXGLRenderer(private val context: Context) : GLSurfaceView.Renderer { private val cameraExecutor = Executors.newSingleThreadExecutor() private lateinit var cameraProvider: ProcessCameraProvider private lateinit var preview: Preview override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) { // 初始化OpenGL环境 GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) } override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) { // 设置视口大小 GLES20.glViewport(0, 0, width, height) } override fun onDrawFrame(gl: GL10?) { // 清空屏幕 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) // 绘制相机预览数据 preview.surfaceTexture?.let { // 更新纹理图像 it.updateTexImage() // 绘制纹理 GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4) } } fun startCamera() { // 启动相机 val cameraProviderFuture = ProcessCameraProvider.getInstance(context) cameraProviderFuture.addListener({ // 获取相机提供者 cameraProvider = cameraProviderFuture.get() // 创建预览用例 preview = Preview.Builder().build() // 绑定预览用例到相机 val cameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() val camera = cameraProvider.bindToLifecycle( context as LifecycleOwner, cameraSelector, preview ) // 创建纹理和SurfaceTexture val surfaceTexture = SurfaceTexture(0) surfaceTexture.setDefaultBufferSize(preview.width, preview.height) // 设置预览用例的SurfaceTexture preview.setSurfaceProvider { val surface = Surface(surfaceTexture) it.provideSurface(surface, cameraExecutor, { surface.release() }) } }, ContextCompat.getMainExecutor(context)) } fun stopCamera() { // 停止相机 cameraProvider.unbindAll() } } ``` 以上是一个简单的GLSurfaceView和CameraX的结合示例,其中GLSurfaceView用于显示相机预览数据,CameraX用于获取相机数据。你可以根据自己的需求来进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值