版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  在AR中播放视频也是一种常见的需求,如在一个展厅中放置的虚拟电视上播放宣传视频,或者在游戏中为营造氛围而设置的虚拟电视视频,本节我们将学习如何在AR场景中播放视频。

(一)VideoPlayer组件

  VideoPlayer是Unity一个跨平台播放视频的组件,这个组件在播放视频时会调用运行时系统本地的视频解码器,即其本身并不负责视频的解码,因此开发人员需要确保在特定平台上视频编码格式能被支持。VideoPlayer不仅能播放本地视频,也能够通过http协议播放远端服务器视频,而且支持将视频播放到摄像头平面(Camera Plane,包括近平面和远平面)、作为渲染纹理(Render Texture)、作为材质的纹理、其他组件的Texture属性,因此,可以方便的将视频播放到摄像头平面、3D物体上、UI界面等,功能非常之强大。VideoPlayer组件界面如下图所示:

  VideoPlayer组件主要属性意义如下表所示:

属性 描述
Source 视频源,其下拉菜单包括两个选项:Video Clip与URL。选择Video Clip时,可以将项目内的视频直接赋给Video Clip属性。当选择URL时,可以使用视频的路径定位视频(如使用http://或者file://),我们既可以在编译前为其设置固定的地址信息,也可以在运行时通过脚本代码实时的修改这个路径达到动态控制视频加载的目的。
Play On Awake 是否在场景加载后就播放视频,如果不勾选该项,应当在运行时通过脚本来播放视频。
Wait For First Frame 该选项主要用来同步视频播放与场景进度,特别是在游戏场景中,如果勾选,Unity则会在游戏开始前等待源视频加载显示,如果取消勾选,则可能会丢弃前几帧以使视频以使视频播放与游戏的其余部分保持同步。在AR中建议不勾选,不勾选时视频会跳帧。
Loop 循环播放。
Skip On Drop 是否允许跳帧以保持与场景同步,建议勾选。
Playback Speed 视频播放速度倍率,如设置为2,视频则以2倍速播放,范围为[0,10]。
Render Mode 定义视频的渲染方式。其下拉菜单中包括四个选项:Camera Far Plane、Camera Near Plane、Render Texture、Material Override、API Only。各渲染方式功能如下:1、Camera Far Plane:将视频渲染到摄像机的远平面,其Alpha值可设置视频的透明度。2、Camera Near Plane:将视频渲染到摄像机的近平面,其Alpha值可设置视频的透明度。3、Render Texture:将视频渲染为Render Texture,通过设置Target Texture定义Render Texture组件渲染到其图像的Render Texture。4、Material Override:将视频渲染到物体材质上。5、API Only:不能使用脚本代码将视频渲染到VideoPlayer.texture属性中。
Audio Output Mode 定义音轨输出,其下拉菜单包括四个选项:None、Audio Source、Direct、API only。选择None时不播放音轨;选择Audio Source时可以自定义音频输出;选择Direct时,会直接将视频中的音轨输出;选择API only时,只能使用脚本代码控制音轨的设置。
Mute 是否禁音。
Volume 音频音频。

  除此这外,VideoPlayer组件还有很多供脚本调用的属性、方法及事件,常用的主要包括:

名称 类型 描述
EnableAudioTrack 方法 启用或禁用音轨,需要在视频播放前设置。
Play 方法 播放视频。
Pause 方法 暂停视频播放。
Stop 方法 方法
isPlaying 属性 视频是否正在播放。
isLooping 属性 视频是否是循环播放 。
isPrepared 属性 视频是否已准备好(如加载是否完成可供播放)。
errorReceived 事件 发生错误时回调。
frameDropped 事件 丢帧时回调。
frameReady 事件 新帧准备好时回调,这个回调会非常频繁,使用需要谨慎。
loopPointReached 事件 视频播放结束时回调。
prepareCompleted 事件 视频资源准备好时回调。
started 事件 视频开始播放后回调。

  VideoPlayer还有很多其他方法、属性、事件,利用这些方法属性可以开发出功能强大的视频播放器。如前所述,VideoPlayer会调用运行时本地系统中的原生解码器,因此为确保在特定平台视频播放正常,需要提前了解运行系统的解码能力,通常,不同的操作系统对视频的原生解码并不相同,下表为当前各大系统对视频格式的原生支持列表。

操作系统 支持的原生解码格式
Windows .asf,.avi,.dv,.mv4,.mov,.mp4,.mpg,.mpeg,.ogv,.vp8,.webm,.wmv
OSX .dv,.m4v,.mov,.mp4,.mpg,.mpeg,.ogv,.vp8,.webm,.wmv
Linux .ogv,.vp8,.webm
Android .3gp,.mp4 ,.webm, .ts, .mkv
iPhone .m4v, .mp4, .mov

  特别需要提醒的是:即使视频后辍格式相同也不能确保一定能解码,因为同一种格式会有若干种编码方式,具体使用过程中需要查询特定平台的解码格式。

(二)实现视频播放

  因为AR中场景是实景的特殊性,以虚拟物体作为视频播放承载物是最好的选择。使用UI及摄像机平面播放模式不太适合AR应用,视频渲染模型使用Material Override非常有利用在模型特定区域播放视频。因此首先我们需要制作一个预制体,在模型的特定区域采用Material Override模式播放视频。

  新建一个工程,并在Hierarchy窗口中新建一个空对象,命名为TVs,将电视机模型文件拖放到该空对象下作为其子对象并调整好大小尺寸,然后新建一个Quad,用这个Quad为作视频播放的载体,调整该Quad到电视机屏幕位置,处理好尺寸与位置关系。因为我们采用Material Override模式,所以我们需要新建一个材质,命名为videos,该材质直接选用Standard着色器,但不赋任何纹理及参数(因为后面我们将使用视频帧作为纹理渲染到材质上),并将该材质赋给Quad对象。最后一步,为Quad对象挂载VideoPlayer组件,并设置好视频源等属性,如下图所示。


  将TVs制作成Prefab,同时删除Hierarchy场景中的TVs对象。为将虚拟电视机放置到真实环境中,我们采取与以晚一样的射线检测放置方式,新建一个C#脚本,命名为AppController,编写如下代码:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
using UnityEngine.UI;[RequireComponent(typeof(ARRaycastManager))]
public class AppControler : MonoBehaviour
{public  GameObject spawnPrefab;public int MaxTVnumber = 1;public Button BtnPlay;public Button BtnPause;public Button BtnStop;static List<ARRaycastHit> Hits;private ARRaycastManager mRaycastManager;private GameObject spawnedObject = null;private ARPlaneManager mARPlaneManager;private int mCurrentTVnumber = 0;private UnityEngine.Video.VideoPlayer mVideoPlayer ;private void Start(){Hits = new List<ARRaycastHit>();mRaycastManager = GetComponent<ARRaycastManager>();mARPlaneManager = GetComponent<ARPlaneManager>();    BtnPlay.transform.GetComponent<Button>().onClick.AddListener(()=> mVideoPlayer.Play());BtnPause.transform.GetComponent<Button>().onClick.AddListener(() => mVideoPlayer.Pause());BtnStop.transform.GetComponent<Button>().onClick.AddListener(() => mVideoPlayer.Stop());}void Update(){if (Input.touchCount == 0)return;var touch = Input.GetTouch(0);if (mRaycastManager.Raycast(touch.position, Hits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds) ){var hitPose = Hits[0].pose;if (spawnedObject == null && mCurrentTVnumber < MaxTVnumber){spawnedObject = Instantiate(spawnPrefab, hitPose.position, hitPose.rotation);mVideoPlayer = spawnedObject.gameObject.transform.Find("Quad").gameObject.GetComponent<UnityEngine.Video.VideoPlayer>();TrunOffPlaneDetect();mCurrentTVnumber++;}else{spawnedObject.transform.position = hitPose.position;}}}void TrunOffPlaneDetect(){mARPlaneManager.enabled = false;foreach (var plane in mARPlaneManager.trackables)plane.gameObject.SetActive(false);}
}

  在上述代码中,我们首先定义了三个按钮(分别用于控制视频播放、暂停、停止)及最大可放置虚拟电视机的数量(视频解码也是一项计算密集型任务,过多的虚拟电视播放视频会严重应用程序性能),然后使用射线检测的方式放置虚拟电视模型,并在放置模型后停止平面检测和已检测到的平面的显示。

  将AppController脚本挂载到Hierarchy场景中的AR Session Origin对象上,然后需要在场景中新建三个UI按钮,并设置好脚本的相应属性(将之前制作的TVs预制体设置到Spawn Prefab属性,将三个按钮设置到对应的按钮属性),如下图所示。

  编译运行,在检测到平面后点击加载虚拟电视机,这时电视机上会播放设定的视频,可以通过按钮控制视频的播放、暂停与停止,效果如下图所示。


  在播放视频时,如果不勾选禁音,音频是可以同步播放的,但播放的音频并不具备空间定位能力,即声音不会呈现空间特性,在AR中实现3D音频功能需要与前文所述的空间音频组件配合使用。

ARFoundation之路-视频播放相关推荐

  1. ARFoundation之路-人脸检测增强之二

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   前节所述使用"标准模型"匹配人脸以检测人脸姿态是众多人脸姿态检测方法中的一种,实际上,人脸姿态估计 ...

  2. ARFoundation之路-环境配置(iOS)之二

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. (一)AppController   在Project窗口Scripts文件夹下,空白处点击鼠标右键,在弹出的级联菜单中依 ...

  3. ARFoundation之路-平面管理

      平面检测是很多AR应用的基础,无论是ARKit还是ARCore,都提供平面检测功能.同时,平面也是可跟踪对象,在前几节中我们知道,ARFoundation使用ARPlaneManager管理器来管 ...

  4. ARFoundation之路-光照估计

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载. (一)光照一致性   AR 与 VR 在光照上最大的不同在于 VR 世界是纯数字世界,有一套完整的数学模型,而 AR 则是 ...

  5. ARFoundation之路-3D物体识别之一

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   3D物体跟踪技术,是指通过图像处理技术对摄像头中拍摄到的3D物体识别定位并对其姿态进行跟踪的技术.3D物体跟踪技术的基 ...

  6. ARFoundation之路-AR阴影生成之一

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   阴影在现实生活中扮演着非常重要的角色,通过阴影我们能直观的感受到光源位置.光源强弱.物体离地面高度. 物体轮廓等,在大 ...

  7. 关于出版《AR开发权威指南-ARFoundation》(2020-10-19更新)

      <AR开发权威指南-ARFoundation>纸质版已上市,某东.某宝上均有销售,感谢大家支持!本书配套源码下载链接:https://pan.baidu.com/s/1ljD01Qz3 ...

  8. 全网史上最全的AR学习开发资源汇总(转载他人整理作品,供参考)

    因公司想做一款AR产品,之前没有怎么去接触AR知识,通过这几天的了解,查看文档,终于对AR的技术知识.技术支持有一个大概了解.整理了一份有关AR方向参考文档,有兴趣的可以学习学习. 转载于知乎:AR新 ...

  9. dotnet 配置 Gitlab 的 Runner 做 CI 自动构建

    今天在少珺小伙伴的协助下,使用了 gitlab 的 runner 给全组的项目做自动的构建.为什么需要使用 Gitlab 的 Runner 做自动构建,原因是之前是用的是 Jenkins 而新建一个底 ...

最新文章

  1. 推荐几个(抖音/阿里/腾讯)年薪100W大佬的硬核公众号
  2. 不能定义声明dllimport_C#:多个声明的一个属性(DLLImport)
  3. legend3---4、lavarel中session使用注意
  4. 记录一下Memcached的用法:
  5. pandas中drop用法_如何使用drop方法对数据进行删减处理
  6. 快手公司厕所装计时器,网友:再也不能带薪拉屎了!
  7. Java虚拟机是如何执行线程同步的
  8. 修改oracle超空间大小,Oracle修改表空间大小详解
  9. 燃烧吧!开发者们,一起在云端构建开放成熟的 ARM 生态!
  10. Workflow WF Reference Links for 2009-03-06
  11. 隐式类型转换 与 隐式类型转换操作符
  12. java写入txt文件_java实现写入并保存txt文件的代码详解
  13. 蓝牙小车换一个蓝牙串口助手就不管用了?
  14. 【编码-纠错码】通信编码中的R-S编码方式
  15. 不会真有人觉得在广州、深圳这样的城市月薪过万很容易吧
  16. java怎么读取docx文件_java – 如何显示或读取docx文件
  17. 读路遥两本书的感悟《人生》《平凡的世界》
  18. tomcat consider increasing the maximum size of the cache
  19. mysql中的mod_MySQL MOD()用法及代碼示例
  20. win8通过u盘装linux系统文件下载,U盘安装纯净版WIN8方法步骤介绍

热门文章

  1. Android进程的五大等级
  2. 红帽第四季度订阅的强劲增长 整体表现超预期
  3. 手动挡停车时挂档有技巧
  4. 施耐德电气推出EcoStruxure架构与平台,开启转型之路
  5. Oracle数据库启停
  6. 智慧水利三维可视化平台功能介绍
  7. 无人机三维建模的优势有哪些?
  8. java 日历签到功能_Android 在日历的基础上实现签到功能
  9. chatGPT 生成随机漫步代码
  10. 2021-05-19:java 中 keyset排序