最近看到一个app,叫扫动, 很神奇,通过在扫动官网上传自己的视频和识别图, 不管是自己还是别人, 只要下载有这个app的用户,都可以扫描图片播放视频,实现了动态更新视频(广告之类都可以通过这个来宣传,做大的话就厉害了 ),看下大概原理吧
原理 :使用朋友的网站,把视频和识别图传上去,识别图大小不能大于2M,使用VoidAR的接口地址,把拼接后的视频地址(即包含视频的宽高字段)和识别图返回给VoidAR云识别服务器,扫描时,通过地址下载服务器的视频
- 使用工具
void ar最新版0.1.g
unity3d 5.6.2 -
做前准备
2.1
这张图即为要实现的功能
2.2
首先准备好视频的识别图,我直接把视频截图当做识别图,结果识别率只有惨淡的两星,所以大家最好是用识别率高的图
视频和识别图传到网站后,在VoidAR的云识别空间里可以看到自己上传的一个列表,包含识别图,星数,拼接后的视频地址,如下图
这里一定要注意,必须要拼接视频地址,不然之后不好做视频自适应
视频格式为“视频地址|视频宽度|视频高度”
- 开工
首先我先说下,上面我提到的为什么要做自适应,因为我想实现当丢失识别后,要将视频变为横屏全屏播放,所以这里必须得知道视频宽高比
先实现普通的扫描播放视频,这个简单,在识别图脚本的OnFind实现播放,这里重点说下丢失以后的操作
3.1 首先在识别到的时候把videoplayer赋值给公共变量VideoPlayer类,然后获取当前屏幕的宽高比 Pratio = (float) Screen.witdh / (float)Screen.height , 在VideoPlayBehaviour中获取视频宽高比 Vratio = (float)videoplayer.texture.witdh / (float)videoplayer.texture.height
(这里获取视频的宽高比,是通过播放视频组件上材质的宽高来的)
3.2 新建Camera,设置为正交投影,新建plane,在其上创建脚本test
// 丢失后全屏播放
public class test : MonoBehaviour
{
Camera camera;
void Start()
{
// 获取到plane父物体Camera
camera = transform.parent.GetComponent<Camera>();
// 设置camera 为正交投影
camera.orthographic = true;
//设置 orthographicSize 尺寸, 这里乘以10 ,是方便之后plane下的子物体都可以通过像素来计算
camera.orthographicSize = Screen.height / 2 * 10;
// 设置plane大小为摄像机像素大小,保证整个plane正好在camera 视野中
transform.localScale = new Vector3(camera.pixelWidth,1,camera.pixelHeight);
}
}
下一步就是丢失后将播放视频的组件放在plane下面作为子物体,在OnLost函数中调整视频的大小
videoplayer.localscale = (1 * Pratio * Vratio ,1,1);
需要注意的部分就是这些, 但坑爹的是,太虚的设置播放视频那块是在Editor状态下写的,所以打包到移动端,就丢失后不能全屏(代码都没经过那块),所以把Editor去掉后,可以了,但是特别卡,而且没有声音 ,很蛋疼, 如果有大神知道有其他的方法,麻烦告诉下我~ ,谢谢啦!(这几天又看了下,发现其实voidar是有提供接口的--,在CloudContorl里面, 实现OnReady函数,然后在父方法里面监听该方法即可)