Unity3D中 — 断点下载在ios移动设备中实现视频播放 (EasyAR)

本人最近研究EasyAR的视频播放,官方给出的是分别是 本地视频加载,和网络视频加载。

需要实现的功能是下载网络视频,保存本地,打包到ios平台中,实现ios移动端扫描视频加载。

实现功能如下

Unity3D中 — 断点下载在ios移动设备中实现视频播放 (EasyAR)_第1张图片
扫描识别卡片实现视频播放.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.实现视频加载并播放的逻辑

Unity3D中 — 断点下载在ios移动设备中实现视频播放 (EasyAR)_第2张图片
设置prefab预控件.png
Unity3D中 — 断点下载在ios移动设备中实现视频播放 (EasyAR)_第3张图片
注意视频的设置路径.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();
            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();    也会写入缓冲区内的数据。

    }

你可能感兴趣的:(Unity3D中 — 断点下载在ios移动设备中实现视频播放 (EasyAR))