EasyAR尝鲜系列教程之视频播放功能的实现

目前EasyAR对视频的支持主要是通过VideoPlayerBehaviour这个类,这个类继承自一个基类VideoPlayerBaseBehaviour。我们可以将其理解为一个视频播放器组件,只要我们将这个组件添加到一个GameObject上,然后简单填写下参数就可以了。可是这个组件博主在32位操作系统下并没有看到实际的效果,虽然说都到了2015年了64位操作系统相对来说更为普及了,可是我觉得支持不支持32位操作系统更多的体现的是一家公司做产品的态度。既然暂时没有办法看到这里的具体效果,我们本着学习的态度对这个组件有所了解就是了。下面是这个组件的一张截图:



从图中我们可以看到这个组件相关参数的设置,这里选取的视频资源是StreamingAssets目录下的video.mp4这个文件,视频资源的Stroge同样支持App、Assets、Absolute这三种类型,和图片资源的Stroge是一样的,关于这三种类型的资源路径的 问题 ,我这里不想再重复说了,这个看看文档就知道了。其次会涉及到视频播放方式和视频缩放的相关参数,这些基本上没什么理解上的难度,大家对照着文档反复尝试就知道各自的用途了。
博主这里不太理解EasyAR为什么不采用MovieTexture或者 unity 3D中针对视频播放提供的相关插件,因为VideoTarget本质上就是把三维模型换成了可以播放的视频而已,所以大家在前面文章的基础上创建一个ImageTarget然后再其下面放置一个附加了VideoPlayerBehaviour的的子物体就可以了。官方的示例项目中提供了两种方式的VideoTarget创建方式,即手动创建和动态创建。手动创建即我们这里提到的这种方式,而动态创建则是由程序在运行时期间创建。这两种方式本质上没有什么不同,需要注意的是VideoPlayerBehaviour有一个EnableAutoPlay的选项,该选项被选中后会启用自动播放,即当识别图被识别后自动播放视频、识别图未被识别则暂停播放视频。如果这个选项没有被选中,我们需要在ITargetEventHandle接口中动手来实现。

增强ImageTarget

这个增强ImageTarget是指在ImageTarget的基础上融入VideoPlayerBehaviour的功能,因为按照官方的示例来考虑,这两部分功能是独立的,博主希望让大家在制作识别图的时候完全忘记区别ImageTarget和VideoTarget,这样我们可以更为专注地制作识别图,因为视频组件就只是设置参数这一件事情,完全可以一次性搞定,所以我们首先来定义一个VideoTargetBaseBehaviour类,一起来看代码:

[C#]  纯文本查看  复制代码
?
 
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using UnityEngine;
using System.Collections;
using EasyAR;
 
public class VideoTargetBaseBehaviour : ImageTargetBehaviour,ITargetEventHandler
{
     /// <summary>
     /// 视频播放模块
     /// </summary>
     private VideoPlayerBehaviour videoPlayer;
 
     /// <summary>
     /// 视频文件路径
     /// </summary>
     public string VideoPath;
 
     /// <summary>
     /// 是否自动播放视频
     /// </summary>
     public bool VideoEnableAutoPlay = true ;
 
     /// <summary>
     /// 是否允许视频循环
     /// </summary>
     public bool VideoEnableLoop = true ;
 
     /// <summary>
     /// 视频类型
     /// </summary>
     public VideoPlayer.VideoType VideoType = VideoPlayer.VideoType.TransparentSideBySide;
 
     /// <summary>
     /// 视频资源类型
     /// </summary>
     public StorageType VideoStorage = StorageType.Assets;
 
 
     /// <summary>
     /// 视频是否加载
     /// </summary>
     private bool isVideoLoaded;
 
     protected override void Start()
     {
         //在Start方法中加载视频、隐藏模型
         base .Start();
         LoadVideo();
         HideObjects(transform);
     }
 
     /// <summary>
     /// 加载视频
     /// </summary>
     private void LoadVideo()
     {
         //创建子物体VideoObject并为其添加视频组件
         GameObject VideoObject = new GameObject( "VideoObject" );
         videoPlayer = VideoObject.AddComponent<VideoPlayerBehaviour>();
         VideoObject.transform.SetParent(transform);
         VideoObject.transform.localPosition = Vector3.zero;
         VideoObject.transform.localRotation = Quaternion.identity;
         VideoObject.transform.localScale = Vector3.one;
 
         //设置视频组件相关参数
         videoPlayer.Storage = VideoStorage;
         videoPlayer.Path = VideoPath;
         videoPlayer.EnableAutoPlay = VideoEnableAutoPlay;
         videoPlayer.EnableLoop = VideoEnableLoop;
         videoPlayer.Type = VideoType;
         videoPlayer.VideoReadyEvent+=videoPlayer_VideoReadyEvent;
         videoPlayer.VideoReachEndEvent+=videoPlayer_VideoReachEndEvent;
         videoPlayer.VideoErrorEvent+=videoPlayer_VideoErrorEvent;
         videoPlayer.Open();
 
         videoPlayer.Play();
     }
 
     #region 视频组件相关事件定义
 
     public virtual void videoPlayer_VideoErrorEvent( object sender, System.EventArgs e)
     {
 
     }
 
     public virtual void videoPlayer_VideoReachEndEvent( object sender, System.EventArgs e)
     {
 
     }
 
 
     public virtual void videoPlayer_VideoReadyEvent( object sender, System.EventArgs e)
     {
 
     }
 
     #endregion
 
     /// <summary>
     /// 隐藏模型的方法
     /// </summary>
     /// <param name="trans">要隐藏的Transform</param>
     void HideObjects(Transform trans)
     {
         for ( int i = 0; i < trans.childCount; ++i)
             HideObjects(trans.GetChild(i));
         if (transform != trans)
             gameObject.SetActive( false );
     }
 
     /// <summary>
     /// 显示模型的方法
     /// </summary>
     /// <param name="trans">要显示的Transform</param>
     public void ShowObjects(Transform trans)
     {
         for ( int i = 0; i < trans.childCount; ++i)
             ShowObjects(trans.GetChild(i));
         if (transform != trans)
             gameObject.SetActive( true );
     }
 
     /// <summary>
     /// 实现ITargetEventHandler接口中的OnTargetFound方法
     /// </summary>
     /// <param name="target">识别目标</param>
     void ITargetEventHandler.OnTargetFound(Target target)
     {
         if (videoPlayer)
             videoPlayer.Play();
         ShowObjects(transform);
     }
 
     /// <summary>
     /// 实现ITargetEventHandler接口中的OnTargetLost方法
     /// </summary>
     /// <param name="target">识别目标</param>
     void ITargetEventHandler.OnTargetLost(Target target)
     {
         if (videoPlayer)
             videoPlayer.Pause();
         HideObjects(transform);
     }
 
     /// <summary>
     /// 实现ITargetEventHandler接口中的OnTargetLoad方法
     /// </summary>
     /// <param name="target">识别目标</param>
     void ITargetEventHandler.OnTargetLoad(Target target, bool status)
     {
 
     }
 
     /// <summary>
     /// 实现ITargetEventHandler接口中的OnTargetUnload方法
     /// </summary>
     /// <param name="target">识别目标</param>
     void ITargetEventHandler.OnTargetUnload(Target target, bool status)
     {
 
     }
}


在这段代码中博主采用了动态创建视频组件的方法,这样我们在制作VideoTarget的时候只需要按照以下步骤即可: 
* 在Assets/EasyAR/Prefabs目录下找到EasyAR这个预制体,添加EasyARConfig组件,然后填写KEY。

* 在Assets/EasyAR/Prefabs目录中找到ImageTarget这个预制体,然后使用VideoTargetBaseBehaviour组件替换默认的ImageTargetBehaviour组件。下面是博主这里的参数配置截图

 

这里博主继续选择idback这张图片,这种方法是博主喜欢的方法,大家可以按照个人喜欢的方式来实现,总而言之万变不离其宗,只需要掌握它的原理就好了。在文章中已经提到过这个组件在32位操作系统下无法正常工作,所以这篇文章就不给大家展示相关的截图了,本文暂时先写到这里等有时间测试成功了再来更新这篇文章。如果像博主这样对 unity3d 比较熟悉的朋友,可以考虑使用MovieTexture或者其它的方式来替代官方目前的这个方案,好了,这篇文章就是这样了,希望大家喜欢!

转载地址 http://qinyuanpei.com。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值