作者:手浪用户2602933263 | 来源:互联网 | 2023-08-12 10:36
前言
今年本人考上研究生,全景VR视频流媒体播放器设计与实现是我的本科设计,这个毕设我在考研后就呆在实验室琢磨一个月了,没动代码,然后放寒假,现在开学一个月左右,这一个月倒是开始着手改进代码,没错,你没听错,改,不是从头开始,不是白手起家,我不是什么大神,VR又是这一两年这么新的东西,虽然本科是计算机专业,但感觉也没学到啥太多,可能我大学四年太荒废了把,可偏偏遇到对毕设很严格的导师,不自己动手研究是不行的,网上根本找到不到什么参考资料。改了一个月了,想写写博客,记录记录,当作读书笔记把,以后也好和人吹吹牛皮把。
毕设介绍
VR播放器是基于虚拟现实(VirtualReality VR)技术的播放器,播放根据视频源文件,可以播放2D平面及3D全影视频,基本场景是观影者戴上显示头盔(如HTC Vive),在其中通过头部的转动可以看到全景视频的每个方向的图像。同时也能听到来自各个方向的声音,声音也会随着头部的转动而发生变化。通过这种视频和声音与人的头部转动的配合,来给人一种身临其境的感觉。360度全景视频是将多视角二维平面视频以360度全景呈现给观赏者的视频,可达到身临其境再现场景的效果,本课题需要基于OpenVR和HTC Vive设计和实现对VR视频流媒体高效播放器。
基本流程
1输入:全景视频的封装格式(mp4,avi等)或音视频的压缩格式(音:acc,mp3等,视:h.264等)或者音视频的采样(PCM)/像素(RGB or YUV)数据,用ffmpeg实现。
2映射贴图:提取视频帧,以opencv的Mat格式存储帧,然后对每一帧进行天空盒六面映射。
3音视频同步:用ffmpeg实现。
4显示:用SDL,openvr实现在HTC Vive眼镜显示。
两个基本代码来源
代码a.0:实验室各位学长学姐的成果,流程是输入一张全景图片,生成六张天空盒的图片并且保存下来,而且全景图在显示屏上显示六分之一,然后根据上下左右按键可以实现移动视角,显示屏显示的内容也会跟着移动。
代码b.0:https://github.com/ValveSoftware/openvr/tree/master/samples/hellovr_opengl 这是一个github上openvr项目的一个样例,拿过来并不能直接运行。
代码b.1:实验室一个学长改进了下,主要是增加了一个SetupRC()初始化函数,功能是读取六张天空盒图片,然后贴图映射绑定啥的,也删了一些东西,然后就可以在VR眼镜上显示观看这六张天空盒组成的全景图。
注:我的毕设就是在这基础上改进的,我并不觉得有啥丢人的,我只是普通人,我觉得在别人代码上改进也很难;后面可以的话我会把这原始代码贴上来,挺大的,一个两千行的代码,一个六百行的代码,当初一个月没动手,在琢磨,就是一脸蒙蔽,完全不懂如何下手这两个代码,用的语言是C或C++,但里面基本都是一大坨各种库的函数,也没有介绍,反正就是当初看得心累。
电脑的一些相关配置
1 购买HTC配件并且配置:https://www.vive.com/cn/product/
1.1硬件:两个VIVE定位器,两个VIVE手柄控制器,一个头盔眼镜。
1.2软件:VIVE软件,Steam VR
2 VS2017配库文件:主要是opencv库盒cuda一起编译(用CMake)出一个opencv_cuda库(这一步其实挺麻烦的,我当初本想把项目移植到我自己的笔记本电脑上,编译配置过这些库特备麻烦,后面由于显卡和VR定位器等硬性条件不能移植,只能在实验室固定电脑上该代码),以及opengl库,ffmpeg库,SDL库一起配置进去,大部分库配置步骤都是include lib .dll PATH四个方面,不懂可以自行百度。配完后创建一个项目添加如下代码测试是否报错:
#include
#include
#include
#if defined( OSX )
#include
#include
#include
#define APIENTRY
#else
#include
#endif
#include
#include
#include
#include
#include "shared/lodepng.h"
#include "shared/Matrices.h"
#include "shared/pathtools.h"
#if defined(POSIX)
#include "unistd.h"
#endif
#ifndef _WIN32
#define APIENTRY
#endif
#ifndef _countof
#define _countof(x) (sizeof(x)/sizeof((x)[0]))
#endif
#include // OpenGL toolkit
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
注:这里我默认各位都大概对计算机方面有所了解,就不具体介绍怎么配置的了。
目前工作进展
1把代码a.0改成a.1,实现读取全景视频,播放全景视频,上下左右按键移动显示屏视角,显示屏只有一个窗口,不是双目窗口。
2把代码a.1改成a.2,主要是封装改进成一个映射贴图函数remap6(),主要功能是把输入一张图片,输出六张天空盒图片。
3把代码b.1+a.2改成c.0,实现读取全景视频,VR眼镜显示全景视频。
456...有待实现:读取播放音频,实现音视频同步,调整播放速度,增加暂停/播放等功能。
注:后续会详细介绍1 2 3的实现。