[OpenGL]从零开始写一个Android平台下的全景视频播放器——3.1 全景视频是如何实现的

article/2025/8/22 3:33:17

Github项目地址

为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过更新会慢一些

回到目录

恭喜Martin同学获得由CSDN颁发的“更新慢慢慢”荣誉称号

全景视频有很多种类,例如Sphere全景,Skybox(Cubemap),Cylinder等,我们以最为常见的Sphere全景视频为例进行说明。

原理

其实要说明这个问题,只需要几张图

  1. 360全景视频截图
    这里写图片描述
    仔细观察我们会发现,视频的底部基本都是一个区域,而视频的最左侧和最右侧是可以连接起来的
  2. 贴图
    这里写图片描述
    全景视频的原理,就是将一张平面图片贴到球体上,红色的 区域是用户的手机屏幕,可视区域就是图中的蓝色部分,使用透视投影(就是近大远小)将这一部分压缩到手机屏幕的这块区域,这样,之前平面图片的变形就被补偿了(当然,可视区域周围确实依然存在形变,尤其当视角较大的时候),同时当用户拿着手机旋转时,我们只需要将球以相反的方向旋转即可。

  3. 地图
    这里写图片描述
    看着这张图,再看看地球仪,是不是和全景视频的情况几乎一致?唯一的区别是,看地球仪的时候我们站在球外,而全景视频往往站在球内

  4. 比例问题
    球体的经度是360度,纬度是180度,所以全景视频的比例通常为2:1,而且由于用户的可视区域往往较小,所以全景视频的分辨率通常较高(1080P是起码要求),对于播放器的要求也就较高。
    之前在一个交流群里看到有人问怎么用程序判断一个视频是否是全景视频(要是每个视频都带Exif这种标记就好了),我能想到的判断方法是:

    • 分辨率较高
    • 宽高比例十分接近2:1
    • 视频第一行同色
    • 视频最后一行同色
    • 视频第一列和最后一列颜色十分接近

    当然,看一眼应该就能看出来了(好像是废话)

实践

原理理解了,那要如何实现把视频贴到球上这个步骤呢?

这里再盗用邱佳迪大大的几张图:
这里写图片描述

球面被切分成若干个三角形(因为三角形是OpenGL的基本形状),并且这些三角形在球面上是等大的,但是在对应的平面上疏密不等(纬度越高越稀疏)
请注意,真正在实现球体绘制的时候采用的不是这种方案而是类似经线纬线的画法
这里写图片描述

OpenGL支持纹理贴图,其实和我们之前显示一张图片在平面上的原理完全一致,只不过这次平面变成了球面
这里写图片描述

用过Unity的应该都知道,U3D中的材质球就是这个样子:
这里写图片描述
将图片贴到球上以后,要如何显示出来呢?这就需要用到MVP矩阵了(Model-View-Projection 模型-视图-投影矩阵)
在OpenGL中,矩阵被定义为一个列主序的3x3或者4x4的数组,如下:

/*** Matrix math utilities. These methods operate on OpenGL ES format* matrices and vectors stored in float arrays.* <p>* Matrices are 4 x 4 column-vector matrices stored in column-major* order:* <pre>*  m[offset +  0] m[offset +  4] m[offset +  8] m[offset + 12]*  m[offset +  1] m[offset +  5] m[offset +  9] m[offset + 13]*  m[offset +  2] m[offset +  6] m[offset + 10] m[offset + 14]*  m[offset +  3] m[offset +  7] m[offset + 11] m[offset + 15]</pre>** Vectors are 4 x 1 column vectors stored in order:* <pre>* v[offset + 0]* v[offset + 1]* v[offset + 2]* v[offset + 3]</pre>*/

MVP矩阵的含义分别是

  • Model:模型矩阵,用于定义单个物体的位移和朝向,只会改变单个物体的状态
  • View: 视图矩阵,用来定义相机的位移和朝向,会改变整个场景
  • Projection: 投影矩阵,定义场景到视口(viewport,可以看成屏幕)的投影方式,决定显示方式,在之前的显示图片和播放平面视频的例子里面,我们使用了正交投影来保证显示不会变形,同时适应视频尺寸和屏幕尺寸

其实这些只是人为定义,这些矩阵的形式是完全一样的,你完全可以用model矩阵来表示相机的位置,但是不会有人建议你这么做
那为什么这三种矩阵能实现不同效果呢?其实这和矩阵的个数有关:

  • 每个物体有一个Model矩阵
  • 每个相机(每只眼睛)有一个View矩阵
  • 每个场景(Scene)有一个Projection矩阵

有一张挺好的图,可以加深理解:
这里写图片描述

当然,在全景视频播放中,并不需要这么复杂,而且改变modelMatrix 和反向改变viewMatrix 是等效的,在全景视频播放器中这三个矩阵起到的功能如下:

private float[] modelMatrix = new float[16];    //球体 拖动、传感器数据改变时改变
private float[] viewMatrix = new float[16];     //观看角度
private float[] projectionMatrix = new float[16];//投影变换,用于缩放

透视投影将球面投影到屏幕的原理可以参考下图:
这里写图片描述

白色平面就是我们的近平面,从近平面到无穷远的这一块球面区域会被压缩到屏幕上,就出现了我们看到的效果(正因为如此,视角大的时候就容易形变了)

关于如何拍摄全景视频以及其他全景视频类型可以参考这里

Github项目地址
回到目录


http://chatgpt.dhexx.cn/article/05eqHZbE.shtml

相关文章

VR全景播放器 AvPro Video

最近项目需要&#xff0c;使用Unity开发VR全景播放器&#xff0c;包括PC端和VR一体机端&#xff08;Android&#xff09;。Unity5.6开始支持VideoPlayer&#xff0c;使用自带的VideoPlayer&#xff0c;很顺利把播放器完成了&#xff0c;使用了很长时间&#xff0c;一直没什么性…

FFmpeg 开发(07):FFmpeg + OpenGLES 实现 3D 全景播放器

该文章首发于微信公众号:字节流动 FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFm…

html全景直播播放器,Insta360 Player(全景视频播放器) V2.3.6 官方版

Insta360 Player是一款性能强劲且专业的全景视频播放器&#xff0c;它支持播放Insta360全景相机拍摄的全景视频和图片&#xff0c;并且支持本地视频的播放&#xff0c;操作非常的简单&#xff0c;有需要的用户可以下载来使用&#xff0c;此软件支持播放 Insta360全景相机产生的…

全景播放器,免安装支持全景视频

全景图片播放器&#xff0c;同时支持全景视频&#xff0c;可直接拖入页面查看。免安装全景播放器,文件不要大于20M Hpano 3D全景播放器是一款免安装可以720度互动浏览的全景图片查看器&#xff0c;通过拖球形全景图片或视频文件进行预览&#xff0c;720度的全方位图片查看器让你…

android 简单的exoplayer全景播放器

全景播放器网上一搜也是一堆一堆的&#xff0c;还有google推出的vrsdk&#xff0c;所以也没啥好说的&#xff0c;就简单记录一下 实现全景主要用到的还是opengles&#xff0c;只要用的开源播放器有setSurface(Surface surface)这个函数&#xff0c;就可以不改播放器源码实现 …

全景播放器

在github上发现的&#xff0c;绿色免安装&#xff0c;完全免费&#xff0c;只有一个界面三个按键&#xff0c;超级简单。里面带来几个全景视频和图片的demo&#xff0c;想体验全景的可以直接打开看看。想换片的时候按键盘的空格键既可以返回主界面。视角查看用鼠标左键点击拖动…

OpenGL ES_手把手教你打造VR全景播放器

OpenGL ES _ 入门_01OpenGL ES _ 入门_02OpenGL ES _ 入门_03OpenGL ES _ 入门_04OpenGL ES _ 入门_05OpenGL ES _ 入门练习_01OpenGL ES _ 入门练习_02OpenGL ES _ 入门练习_03OpenGL ES _ 入门练习_04OpenGL ES _ 入门练习_05OpenGL ES _ 入门练习_06OpenGL ES _ 着色器 _ 介…

播放全景视频【一】:用unity Video Player视频播放器来播放360全景视频

先上图为敬 本文测试环境&#xff1a; Win10 Unity 2020.3.40 Pico G2 4k VR一体机 一、使用Video Player心理负担比较小 使用Unity自带的【视频播放器&#xff08;Video Player&#xff09;】来播放360全景视频的【好处】&#xff1a; 1、控制逻辑与2D视频相同&#xff0c…

利用FFmpeg和OpenGL ES 实现 3D 全景播放器

前言 我们已经利用 FFmpeg OpenGLES OpenSLES 实现了一个多媒体播放器&#xff0c;本文将基于此播放器实现一个酷炫的 3D 全景播放器。 全景播放器原理 全景视频是由多台摄像机在一个位置同时向四面八方拍摄&#xff0c;最后经过后期拼接处理生成的。 用普通的多媒体播放器播…

航空客运订票系统(C语言,软件用的DEV)

这两天整理之前的作业代码&#xff0c;把自己一点一点敲出来的系统又看了一下&#xff0c;挑几个发出来供大家参考。想要源码、报告可以找我啦&#xff0c;代码的注释之前写的都是非常详细的&#xff01; 但是不是无偿的啦&#xff08;不坑&#xff0c;一杯奶茶喽&#xff0c;不…

数据结构_航空客运订票系统(C实现)

文章目录 总述代码粗糙版修理版 还可以修正的点:余票不足时仍然提示还剩下几张(而不是直接拒绝该用户的订票操作)对于购票者的id 不单单是说约定一个可以不重复的主键(命名规则),而且还要辅以必要的检查违约功能 总述 在这里插入代码片 1&#xff0e; 问题描述&#xff1a;(题…

航空机票订票系统

项目介绍 主要功能是使订票系统可以录入航班情况&#xff0c;查询某个航线的情况、办理订票、办理退票、修改航班信息、查询订票信息等。完成此系统&#xff0c;需要综合运用数据结构课程中学到的几种典型数据结构&#xff0c;以及程序设计语言&#xff08;C语言&#xff09;&…

【数据结构应用】航空客运订票系统

目录 前言 一、作业要求介绍 二、各个函数的实现 1.头文件总结需要的功能 &#xff08;1&#xff09;结构体的定义 &#xff08;2&#xff09;各个功能的函数 2.各个函数的具体实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;打印航班信息表 &#xff08;4&…

Java实现航空机票订票系统

1、要求&#xff1a; &#xff08;1&#xff09;设计每条航线所涉及的信息&#xff0c;如终点站名、航班号、飞机号、飞机周日&#xff08;星期几&#xff09;、乘员定额、余票量、订定票的客户名单&#xff08;包括姓名、订票量、舱位等级1&#xff0c;2或3&#xff09;等&…

c语言航空订票系统程序设计,C语言航空订票系统

C语言航空订票系统 这 是 一 篇 用 C 语 言 编 写 的 航 空 订 票 系 统 的 论 文 。 该 系 统 使 用 的 是十 字 链 表 结 构 &#xff0c; 包 含 有 订 票 &#xff0c; 退 票 &#xff0c; 录 入 航 班 信 息 &#xff0c; 查 询 航 班 余 票 &#xff0c; 查询 个 人 订 票…

航空订票系统C++课程设计

航空订票系统 项目实践完整源码 前言一、功能演示二、代码总结 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 编写程序模拟航空订票系统&#xff0c;要求实现以下功能&#xff1a; ① 允许增、删、改航班信息&#…

数据结构课设-航空客运订票系统(C语言实现)

航空客运订票系统&#xff08;C语言实现&#xff09; 系统框架已完成功能用户功能管理员功能其他 运行结果管理员添加航班客户订票添加候补客户退票 代码 系统框架 已完成功能 用户功能 查询航线&#xff1a;根据旅客提出的终点站名输出航班的信息。订票业务&#xff1a;根据…

C++课程设计:航空客运订票系统

航空客运订票系统 选题背景 方案论证 过程论述 运行结果 完整代码 选题背景 ①背景: 现在人们更多的使用飞机作为出行交通工具&#xff0c;因此机票票务市场也在快速发展。国内外航空事业在飞速发展&#xff0c;各航空公司对票务管理的要求也在不断的提高&#xff0c;对…

基于ssm的航空订票系统

基于ssm的航空订票系统 一、技术栈 ​ 前端 ​ vue全家桶、element-ui组件库、moment.js插件 ​ 后端 ​ springboot springmvc mybatis 二、功能描述 本系统是基于B/S架构的航空订票系统 系统分为三大用户–乘客、航空公司、后台管理员&#xff0c;本次课程设计主要实现…

课程设计之航空客运订票系统

/***************************************************** * 版权所有&#xff08;C&#xff09;2016&#xff0c;王力源 * *文件名称&#xff1a;A.C 航空售票系统 *文件标识&#xff1a;无 *内容摘要&#xff1a;航空售票系统 *其他说明&#xff1a;无 *当前版本&#xff1…