对于视频播放器这个 App 大家都不陌生,在我们日常生活中随处可见,但对于用户而言,最重要的就是如何能节约流量,使用简单,观看视频流畅等体验。

对于 Android
VideoCache 在各大网站的学习文档、教程已经很多,而且层出不穷,但是对于鸿蒙来讲,还是一个新的领域,因此,鸿蒙版的 VideoCache
顺势而为,华丽的诞生了。
01
功能介绍
鸿蒙 VideoCache 视频缓存组件,主要功能包括:视频缓冲,在线播放视频,边下载边缓存,缓冲进度和播放进度同时进行,拖动播放,横竖屏切换,音量调节等主要功能。
模拟机效果图如下:
①竖屏状态


②横屏状态


接下来得内容就是重中之重,对于开发者来讲,如何简单并且快速的使用该 VideoCache 视频缓存组件,这才是开发者最关注的问题。
下面则详细介绍 VideoCache 的使用以及开发指南。
02
VideoCache 使用指南
①新建工程, 添加组件 Har 包依赖
在应用模块中添加 HAR,只需要将 videocachelibrary-debug.har 复制到 entry\libs 目录下即可。
②修改配置文件

修改代码中的配置:
a.在基类中实例化代理服务。
核心代码如下:
httpProxyCacheServer =
new HttpProxyCacheServer.Builder(theApplication).headerInjector(new UserAgentHeadersInjector())
.maxCacheSize(1024 * 1024 * 1024)// 1 Gb for cache
.singleFileBandwidth(600)//单位KB,https需要1.5倍左右
.build();
b.在使用的地方初始化播放器,并调用代理服务将新生成的路径传入播放器。
proxyUrl = BaseSlice.getProxy().getProxyUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
BaseSlice.getProxy().registerCacheListener(mCacheListener, proxyUrl);//缓存监听
playerVideo = new PlayerVideo(this, proxyUrl, this, layout);
playerVideo.setDisplayMath(0, 1000);
c.其他相关设置方法。
* 设置播放器的宽高
dependentLayout.setWidth(width);
dependentLayout.setHeight(height);
或者:
dependentLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
dependentLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
* 设置播放器的横竖屏
//横屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.LANDSCAPE);
//竖屏
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.PORTRAIT);
//系统判断
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.UNSPECIFIED);
//跟随栈中应用
abilitySlice.getAbility().setDisplayOrientation(AbilityInfo.DisplayOrientation.FOLLOWRECENT);
* 初始化播放器
player = new Player(context);
surfaceProvider.pinToZTop(false);
java.util.Optional<ohos.agp.graphics.SurfaceOps> optional = surfaceProvider.getSurfaceOps();
SurfaceOps surfaceOps = optional.get();
surfaceOps.addCallback(new VideoSurfaceCallback(surfaceOps, loadUrl,
player, this
));
* 播放方法
player.play();
* 暂停播放方法
player.pause();
03
VideoCache 开发指南
在上述中,已经大概说了VideoCache 的功能点,视频缓冲,在线播放视频,边下载边缓存,缓冲进度和播放进度同时进行,拖动播放,横竖屏切换,音量调节等主要功能,接下来一一说明主要实现方法。
在视频播放器中,最常见的就是缓冲进度条,进度条用户可以很直观的看到目前已经缓冲的视频有多少,缓冲了多长时间。
progressBar.setMaxValue(100);
progressBar.setMinValue(0);
progressBar.setProgressValue(cacheProgress);
通过根据已经缓冲的字节,即可计算出 cacheProgress。
MaxValue 值不是固定的 100,也可以按照视频的时长、字节等设置,然后计算百分比即可,根据具体需求设计。
MinValue 设置 progress 的起始点,最初的起始点肯定是 0,但是当视频在播放中途,暂停,在开始的时候,则需要设置为暂停时的值,这样不至于又回到 0 来观看视频。
最后,既然是视频缓存组件,那么重中之重就是如何缓存,接下来重点介绍。
VideoCache 主要通过代理策略将网络请求代理到本地服务,本地在决定是从本地缓存拿数据还是发起网络请求,如果发起网络请求就先将数据写入缓存,再从本地提供视频数据给视频播放器。

这样就达到了边播放边缓存的策略。
具体步骤如下:
①在项目的基类初始化一个全局的代理服务 HttpProxyCacheServer。

②生成缓存文件名,默认是使用的 MD5 方式生成 key,考虑到一些业务逻辑,我们也可以继承一个 FileNameGenerator 来实现自己的策略。

③本地代理实现策略,首先是构造一个本地 127.0.0.1 的 ServerSocker,随机分配了一个端口,然后启动一个线程去执行 WaitRequestsRunnable。


Files 类:此类是对 Java 中原有的 File 类的封装,原 File 类仅可处理一个文件,Files 类可同时对多个文件进行处理。



TotalCountLruDiskUsage 类、TotalSizeLruDiskUsage 类和 UnlimitedDiskUsage 类。
LruDiskUsage 类是标题中前两个类的父类,同时控制缓存文件的大小和数量,需要判断当前缓存文件的(总大小&总数量)未超过阈值时,才会缓存新的文件。
TotalCountLruDiskUsage 类和 TotalSizeLruDiskUsage 类分别只对缓存文件总数量或者缓存文件总大小进行限制,满足一个条件便可以缓存新的文件。
TotalCountLruDiskUsage 类和 TotalSizeLruDiskUsage 类各有两个方法:一个方法用于设定缓存文件的阈值;一个方法用于判断当前缓存数据是否超过了设定的阈值。


更多原创,请关注软通动力 HarmonyOS 学院:
https://harmonyos.51cto.com/column/30
👇点击关注鸿蒙技术社区👇
专注开源技术,共建鸿蒙生态

点“阅读原文”了解更多






