赞
踩
压缩方式选择BuildAssetBundleOptions.UncompressedAssetBundle即可。
一般有动态修改要求的资源都会存放在StreamingAssets中,但是考虑到这个文件夹中的资源会原封不动的打包,所以通过打包成ab再加载的方式防止宝贵的视频资源被直接盗版取用。
通过管道给视频资源原名称打包,核心代码如下:
[MenuItem("Tools/Build AssetBundles")] public static void Build() { ClearExitAssetBundleNames(); if(buildTarget == BuildTarget.NoTarget) { switch(EditorUserBuildSettings.activeBuildTarget) { case BuildTarget.WebGL: buildTarget = BuildTarget.WebGL; break; case BuildTarget.StandaloneWindows64: buildTarget = BuildTarget.StandaloneWindows64; break; } } Debug.Log("当前打包平台为:" + buildTarget); Object[] arr = Selection.objects; if (arr.Length == 0) { Debug.Log("Please choose folders that in the Project panel to pack."); } for (int i = 0; i < arr.Length; i++) { string resPath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + "/" + AssetDatabase.GetAssetPath(arr[i]); DirectoryInfo directoryInfo = new DirectoryInfo(resPath); string targetPath = Application.streamingAssetsPath + "/AssetBundles"; SetAssetBundleNames(directoryInfo); if (!Directory.Exists(targetPath)) { Directory.CreateDirectory(targetPath); } BuildPipeline.BuildAssetBundles(targetPath, BuildAssetBundleOptions.None, buildTarget); ClearExitAssetBundleNames(); AssetDatabase.Refresh(); } }
1.通过EditorUserBuildSettings.activeBuildTarget自动确定当前打包平台;
2.通过Selection打包当前文件夹下所有视频文件。
打包成ab后,我们还需要加载视频资源,再通过VideoPlayer或其他方式进行播放等操作。
1.通过AssetBundleManifest获得所有ab名称再组合路径一个个的去读取;
2.通过ab名再组合路径一个个的去读取。
两个加密后的视频文件:
1)7分46秒 296MB
2)49秒 31.7MB
通过各种方式得到不同的Load效率时间:
Debug.Log("开始:" + System.DateTime.Now + " " + System.DateTime.Now.Millisecond); 14s 2s //AssetBundle assetBundle = AssetBundle.LoadFromFile(path); //VideoClip clip = assetBundle.LoadAsset<VideoClip>(elementInfos[selectElement]); //18s 1s //AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(path); //VideoClip clip = assetBundleCreateRequest.assetBundle.LoadAsset<VideoClip>(elementInfos[selectElement]); //15s 1s //AssetBundle assetBundle = AssetBundle.LoadFromFile(path); //AssetBundleRequest assetBundleRequest = assetBundle.LoadAssetAsync<VideoClip>(elementInfos[selectElement]); //VideoClip clip = assetBundleRequest.asset as VideoClip; //16s 2s AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(path); AssetBundleRequest assetBundleRequest = assetBundleCreateRequest.assetBundle.LoadAssetAsync<VideoClip>(elementInfos[selectElement]); VideoClip clip = assetBundleRequest.asset as VideoClip; Debug.Log("结束:" + System.DateTime.Now + " " + System.DateTime.Now.Millisecond);
我们对加载文件和加载资源两个环节进行了不同情况的异步处理,通过上面的代码,我们可以发现:视频越大,读取时间越慢;视频越小,读取时间越快。
大视频最快14s的速度,如果是做产品,那不用上线了,我们怎么办呢?
1)原始视频
2)方式一压缩
3)方式二压缩
通过这三张图,我们可以发现,压缩方式一相对原视频节省了上千个字节,但是压缩方式二相对原视频却多了4-5个字节。
压缩方式一:BuildAssetBundleOptions.None;
在本文第二节的打包代码中可以看到,也是第三节读取中使用的ab模式。
压缩方式二:BuildAssetBundleOptions.UncompressedAssetBundle;
不压缩,也是最终使用的方式,视频的读取不论在Editor模式或者Windows发布后都可以做到秒响应,无延迟,与第三节的四种读取方式无关。
虽然通过api修改了打包选项达到了无延迟读取的需求,但是压缩后的资源反而还比原视频更占空间,我们怎么办呢?
7z压缩或许是个方向,等下次笔者有了发现,再来与大家交流。
最后,祝大家2020春节快乐!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。