本人最近研究EasyAR的视频播放,官方给出的是分别是 本地视频加载,和网络视频加载。
需要实现的功能是下载网络视频,保存本地,打包到ios平台中,实现ios移动端扫描视频加载。
实现功能如下
扫描识别卡片实现视频播放.jpg需要掌握知识点如下
1.Unity3D在不同平台的路径设置。(1.ios端 2.Android端 3. Windows )
2.EasyAR 的官方 视频播放脚本 VideoPlayerBaseBehaviour (熟悉文档)
3.实现视频加载并播放的逻辑
4.FileStream 在Unity3D和ios平台的执行差别
1.Unity3D常用的四种文件路径
Application.dataPath
Application.streamingAssetsPath
Application.persistentDataPath
Application.temporaryCachePath
本人只熟悉ios平台,对其他平台不是很熟悉,其他平台路径可自行百科。
1. Application.dataPath
/var/containers/Bundle/Application/app sandbox/xxx.app/Data
2. Application.streamingAssetsPath
/var/containers/Bundle/Application/app sandbox/test.app/Data/Raw
3. Application.temporaryCachePath
/var/mobile/Containers/Data/Application/app sandbox/Library/Caches
4. Application.persistentDataPath
/var/mobile/Containers/Data/Application/app sandbox/Documents
iOS和Mac OS X不同于Windows,app都是在一个沙盒空间中运行,每个app也有一个独立的数据存储空间,各app彼此不能互相访问、打扰。
dataPath是app程序包安装路径,app本身就在这里,此目录是只读的。streamingAssetsPath是dataPath下的Raw目录。
app的独立数据存储目录下有三个文件夹:Documents,Library和tmp。
Documents目录,这个目录用于存储需要长期保存的数据,比如我们的热更新内容就写在这里。需要注意的是,iCloud会自动备份此目录,如果此目录下写入的内容较多,审核的可能会被苹果拒掉。
Library目录,这个目录下有两个子目录,Caches和Preferences。
Caches是一个相对临时的目录,适合存放下载缓存的临时文件,空间不足时可能会被系统清除,Application.temporaryCachePath返回的就是此路径。我把热更新的临时文件写在这里,等一个版本的所有内容更新完全后,再把内容转移到Documents目录。
Preferences用于应用存储偏好设置,用NSUserDefaults读取或设置。
tmp目录,临时目录,存放应用运行时临时使用的数据。 需要注意的是,以上无论临时、缓存或者普通目录,如果不需要的数据,都请删除。
2.VideoPlayerBaseBehaviour 脚本
文档介绍
VideoPlayerBaseBehaviour Easy官方文档
3.实现视频加载并播放的逻辑
设置prefab预控件.png 注意视频的设置路径.png代码如下
public void LoadVideo(string videoName)
{
if (System.IO.File.Exists (filePath + "workroom1.mp4") == false) {
return;
} // 判断是否存在下载目录中,在ios移动设备中,就是判断是否存在沙盒中
subGameObject = Resources.Load ("VideoPlayer") as GameObject; // 实例化事先准备好的预控件prefab
if (subGameObject != null) { // 因为update 方法会不断调用,所以再次判断是否已经存在实例控件,防止重复加载
subGameObject = Instantiate(subGameObject);
}
subGameObject.transform.parent = this.transform; //设置物体的父类为当前类
// 设置参数位置
subGameObject.transform.localPosition = new Vector3(0, 0.225f, 0);
subGameObject.transform.localRotation = new Quaternion();
subGameObject.transform.localScale = new Vector3(1.0f, 0.02f, 0.45f);
// 重点 加载视频的脚本
VideoPlayerBaseBehaviour videoPlayer = subGameObject.GetComponent<VideoPlayerBaseBehaviour>();
if (videoPlayer)
{
videoPlayer.Storage = StorageType.Absolute; // StorageType指定了文件存放的根目录,你可以在所有相关接口中使用相对于这个根目录的相对路径 下面会给出官方文档
videoPlayer.Path = filePath + videoName; // 视频路径
videoPlayer.VideoScaleMode = VideoPlayerBaseBehaviour.ScaleMode.Fill; //视频缩放模式
videoPlayer.EnableAutoPlay = true; // 启用自动播放
videoPlayer.EnableLoop = true; // 启用循环播放
videoPlayer.Open(); //打开视频 一个异步方法
}
}
4.FileStream 在Unity3D和ios平台的执行差别
使用 FileStream 类对文件系统上的文件进行读取、写入、打开和关闭操作,并对其他与文件相关的操作系统句柄进行操作,如管道、标准输入和标准输出。读写操作可以指定为同步或异步操作。FileStream 对输入输出进行缓冲,从而提高性能。
在上篇文章中有代码展示,打包到ios平台中,需要判断下载文件数据是否存在沙盒中。存在的情况下,就不必再关闭FileStream文件,否则程序会崩溃,补充代码判断。
if (System.IO.File.Exists (savePath) == true ) { //如果已经下载完毕,并且全部数据写入沙盒(临时文件已经被转换为正式文件)
return;
}
else{
fs.Close(); // 关闭流并释放所有资源,同时将缓冲区的没有写入的数据,写入然后再关闭。
fs.Dispose();//释放流所占用的资源,Dispose()会调用Close(),Close()会调用Flush(); 也会写入缓冲区内的数据。
}
网友评论