归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:17201回复:56

(Unity3D)Vuforia开发高阶一-VideoPlayback

楼主#
更多 发布于:2015-06-24 23:32
使用Vuforia自定义ImageTarget案例比较简单,拖进去几个预制(preferb)就好了。
例如:ImageTargetARCamera

但是如果想添加VideoPlayback的案例时,直接再ImageTarget子目录下添加Video预制是不可以的。还需要绑定一些特定的脚本。
比如PlayVideoVideoPlaybackUIEventHandler

StreamingAssets文件夹:视频文件需要放在这里
放在这个文件夹中的内容,将会被完整地拷贝到系统中,对于不同的系统,对应的路径是不一样的。
PCMac or Windows):
path = Application.dataPath + "/StreamingAssets";
Android中:
path = "jar:file://" + Application.dataPath + "!/assets/";
iOS中:
path = Application.dataPath + "/Raw";
PS:在Android系统的Sample中,视频资源文件在Assets文件夹中。 assets文件夹里面的文件都是保持原始的文件格式。

1、导入sample工程,查看工程结构:

图片:图片4.png


ImageTargets案例相比,只是将原来的模型换成Video,另外还有添加几个脚本。

a) PlayVideo
位于ARCamera组件的最后一个脚本。

图片:图片5.png


主要作用:说明怎么在材质上播放视频,单击播放,双击进入功能选择栏,选择打开全屏播放功能,即可进入全屏播放。PS:任何时候都可以进入全屏状态。当然任何时候也可以退出全屏,但是退出全屏意味着重新播放。如果希望继续播放,可以通过修改另一个脚本文件的代码实现,见VideoPlaybackUIEventHandler
b) VideoPlaybackUIEventHandler
private void OnTappedOnFullscreenButton(bool tf)
    {
        mFullScreenMode = tf;
        if (tf)
        {
            VideoPlaybackBehaviour video = PickVideo();
            if (video != null)
            {
                if (video.VideoPlayer.IsPlayableFullscreen())
                {
                    //On Android, we use Unity's built in player, so Unity application pauses before going to fullscreen. 
                    //So we have to handle the orientation from within Unity. 
#if UNITY_ANDROID
     Screen.orientation = ScreenOrientation.LandscapeLeft;
#endif
                    // Pause the video if it is currently playing
                    video.VideoPlayer.Pause();
   
                    // Seek the video to the beginning();
//修改这里,将position还原为正在播放的位置
                    video.VideoPlayer.SeekTo(0.0f);
   
                    // Display the busy icon
                    video.ShowBusyIcon();
   
                    // Play the video full screen
                    StartCoroutine ( PlayVideo.PlayFullscreenVideoAtEndOfFrame(video) );
   
                    //Flash turns off automatically on fullscreen videoplayback mode, so we need to update the UI accordingly
                    this.View.mCameraFlashSettings.Enable(false);
                }
            }
        }
   
        OnTappedToClose();
}

这个文件主要作用:UI组件的选项控制,包括对焦、前后摄像头设置以及是否全屏设置等。
这个脚本不是必需,有时候不需要这些。

2、修改Target
从官网TargetManager中上传需要的Target图片,再下载对应的数据包。
Target的制作看这篇教程《Target Manager使用教程》。

图片:图片6.png


选中需要的Target,点击Download Dataset

图片:图片7.png


再选择对应的开发平台,这里我们使用Unity Editor
下载完之后为Unitypackage的包,名称即为Target所在的database的名称

图片:图片8.png


双击导入Unity中。

图片:图片9.png


其中jpg即为识别图。
dat为数据集,包含Target的一些特征数据。Xml为配置文件,直接与dat链接。如果之前选择SDK版本,而不是Unity的话,只有xmldat
最后在ARCamera中激活这个Traget dataset.

图片:图片10.png


并将对应的ImageTarget对应的识别图修改:

图片:图片11.png


有时候,会出现扫识别没有反应的情况,这时候可以先过来检查以下这两个地方,看看dataset是否激活。
可以看到scene中,原先的chips已经被替换了。

图片:图片12.png


3、修改视频资源
前面说了视频资源都是放在StreamingAssets文件夹中,所以,我们把准备好的视频拖放到这个位置。
注意,试过mp4m4v格式的视频都可以,其他没有试过,如果还支持其他格式,请留言告知。不过这里只需要支持mp4格式,已经足够了。

如果你电脑没有安装QuickTime,那么就导入不了视频文件,所以,首先还需要安装这个软件。

图片:图片13.png


安装完成之后需要重启电脑,然后导入视频文件即可。
然后修改对应Video组件中的视频路径。
可以说Vuforia支持两种方式使用视频文件:
1、本地文件:视频名称.视频格式,视频格式一定要加。
2、网络视频:URL

图片:图片14.png




图片:图片15.png


其中Keyframe为识别到Target,视频准备播放时的背景图片。

OK,这样就可以播放了吗?NOPE
4.x版本之前是可以的,然后在4.x版本后,一定要记得加License key

图片:图片16.png


关于License Key,大家可以去看这篇教程《关于License Manager.

4、设置识别后自动播放
勾选Video组件下的Auto PlayOK

图片:图片17.png



分析一下Auto Play的原理:
TrackablEventHandler脚本:

private void OnTrackingFound()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();
        Collider[] colliderComponents = GetComponentsInChildren<Collider>();
   
        // Enable rendering:
        foreach (Renderer component in rendererComponents)
        {
            component.enabled = true;
        }
   
        // Enable colliders:
        foreach (Collider component in colliderComponents)
        {
            component.enabled = true;
        }
   
        Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
   
        // Optionally play the video automatically when the target is found
   
        VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>();
        if (video != null && video.AutoPlay)
        {
            if (video.VideoPlayer.IsPlayableOnTexture())
            {
                VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus();
                if (state == VideoPlayerHelper.MediaState.PAUSED ||
                    state == VideoPlayerHelper.MediaState.READY ||
                    state == VideoPlayerHelper.MediaState.STOPPED)
                {
                    // Pause other videos before playing this one
                    PauseOtherVideos(video);
                    // Play this video on texture where it left off
                    video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
                }
                else if (state == VideoPlayerHelper.MediaState.REACHED_END)
                {
                    // Pause other videos before playing this one
                    PauseOtherVideos(video);
   
                    // Play this video from the beginning
                    video.VideoPlayer.Play(false, 0);
                }
            }
        }
   
        mHasBeenFound = true;
        mLostTracking = false;
}


如果video不等于空并且设置了AutoPlay
if (video != null && video.AutoPlay)
那么,
video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
注意这里使用了video.VideoPlayer.GetCurrentPosition(),所以前面说的全屏返回Texture播放时,继续播放可以使用这个。其中false表示非全屏。

5、按钮控制视频播放暂停
既然自动播放的原理都弄明白了,按钮控制视频播放停止不是很容易的事情吗?
直接执行下面这个就可以:
video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
video.VideoPlayer.Pause();

OKUnity3D平台下的视频播放就介绍到这里。Android平台和iOS平台下类似。
AR学院(www.arvrschool.com),从这里感触未来!

欢迎分享

Mayday
侠客
侠客
  • UID340
  • 粉丝0
  • 关注0
  • 发帖数7
沙发#
发布于:2015-11-25 20:26
看了视频再看这个,感觉好理解些了
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2015-11-25 20:38
Mayday:看了视频再看这个,感觉好理解些了回到原帖
哈哈,是吧
AR学院(www.arvrschool.com),从这里感触未来!
tyf0321
新手
新手
  • UID575
  • 粉丝1
  • 关注0
  • 发帖数10
地板#
发布于:2015-12-03 20:47
导入视频时遇到问题
我安装了QuickTime,视频导入到这个文件夹后并不能对它进行操作,案例自带的视频也不能被拖动
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
4楼#
发布于:2015-12-03 21:06
tyf0321:我安装了QuickTime,视频导入到这个文件夹后并不能对它进行操作,案例自带的视频也不能被拖动回到原帖
安装之后重启一下电脑试试。
AR学院(www.arvrschool.com),从这里感触未来!
tyf0321
新手
新手
  • UID575
  • 粉丝1
  • 关注0
  • 发帖数10
5楼#
发布于:2015-12-03 21:54
归海一啸:安装之后重启一下电脑试试。回到原帖
可是我的QuickTime不是新装的,之前就有
tyf0321
新手
新手
  • UID575
  • 粉丝1
  • 关注0
  • 发帖数10
6楼#
发布于:2015-12-03 21:58
归海一啸:安装之后重启一下电脑试试。回到原帖
我重启了一下,还是不行=。=还是上面样子的图标
sgclzqq
侠客
侠客
  • UID545
  • 粉丝0
  • 关注2
  • 发帖数43
  • 社区居民
  • 忠实会员
7楼#
发布于:2015-12-09 00:36
老大,刚开始我弄了一个ImageTarget对应一个video可以播放,但拖了两个ImageTarget上去,分别对应不同的video,可以识别出来,就是无法点击播放,是不是要再加个判断,然后选择播放哪个视频?要加的话,是写在Update里面吗?老大,请赐教哈,谢啦[
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
8楼#
发布于:2015-12-09 00:50
sgclzqq:老大,刚开始我弄了一个ImageTarget对应一个video可以播放,但拖了两个ImageTarget上去,分别对应不同的video,可以识别出来,就是无法点击播放,是不是要再加个判断,然后选择播放哪个视频?要加的话,是写在Update里...回到原帖
两个都不能吗?
你替换它demo中的两个视频试试
一般不需要判断的
AR学院(www.arvrschool.com),从这里感触未来!
sgclzqq
侠客
侠客
  • UID545
  • 粉丝0
  • 关注2
  • 发帖数43
  • 社区居民
  • 忠实会员
9楼#
发布于:2015-12-09 11:13
归海一啸:两个都不能吗?
你替换它demo中的两个视频试试
一般不需要判断的
回到原帖
可以啦。老大。弄好了,太粗心了,我把PlayVideo脚本都加在了video跟arcamera下面,把video下面的脚本删了后就好了。不好意思老大,太粗心啦
sgclzqq
侠客
侠客
  • UID545
  • 粉丝0
  • 关注2
  • 发帖数43
  • 社区居民
  • 忠实会员
10楼#
发布于:2015-12-15 18:04
老大,我又来了,遇到了播放黑屏的问题,我做了几个场景,在主界面和AR场景之间加了个loading场景,然后,第一次进去可以播放,点击按钮返回到主界面,再次进入AR场景播放视频黑屏,是不是返回的同时要把AR场景销毁掉?改怎么销毁?求老大赐教。。
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
11楼#
发布于:2015-12-15 19:01
sgclzqq:老大,我又来了,遇到了播放黑屏的问题,我做了几个场景,在主界面和AR场景之间加了个loading场景,然后,第一次进去可以播放,点击按钮返回到主界面,再次进入AR场景播放视频黑屏,是不是返回的同时要把AR场景销毁掉?改怎么销毁?求老大赐教。...回到原帖
http://www.arvrschool.com/read.php?tid=344
你看看这帖子
AR学院(www.arvrschool.com),从这里感触未来!
sgclzqq
侠客
侠客
  • UID545
  • 粉丝0
  • 关注2
  • 发帖数43
  • 社区居民
  • 忠实会员
12楼#
发布于:2015-12-15 19:18
归海一啸:http://www.arvrschool.com/read.php?tid=344
你看看这帖子
回到原帖
谢啦,老大。知道啦,嘿嘿
bigshuai
贫民
贫民
  • UID689
  • 粉丝0
  • 关注0
  • 发帖数2
13楼#
发布于:2015-12-22 21:34
有个地方一直不明白,请教老师,进入识别画面之前,先进入unity画面,在进入绿色的vuforia画面,最后进入video playback的白色页面,点击OK才能进入识别,后两个画面去不掉吗?
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
14楼#
发布于:2015-12-22 21:36
bigshuai:有个地方一直不明白,请教老师,进入识别画面之前,先进入unity画面,在进入绿色的vuforia画面,最后进入video playback的白色页面,点击OK才能进入识别,后两个画面去不掉吗?回到原帖
可以去掉的,你看我视频教程,应该又讲到
AR学院(www.arvrschool.com),从这里感触未来!
上一页
游客

返回顶部