浅谈Android视频缓存库

背景

我们都了解播放器的作用就是把音视频压缩数据转换成原始的音视频数据渲染出来,这样我们就可以看到画面、听到声音了。这里的播放器就存在两个问题,第一个问题是视频源存在云端,我们每次看完视频之后重新观看,需要重新请求远端视频数据,这就会造成带宽的浪费。第二个问题是视频的秒开体验当我们从Feed流点击视频播放的时候,由于需要从云端获取视频,造成秒开体验较差。我们该如何去解决这两个问题呢?这就是我们今天要说的视频缓存库的核心功能了。下面让我们走进Android视频缓存库,看它是如何设计、如何优雅的解决这两个问题的。

AndroidVideoCache

下面会详细分析AndroidVideoCahce的实现原理、AndroidVideoCahce存在的问题、AndroidVideoCahce的优化重构。最终打造一款适合业务需求、稳定的视频缓存库。

AndroidVideoCahce的基本原理

AndroidVideoCache通过代理的策略将我们的网络请求代理到本地服务,本地服务首先判断播放器获取的数据本地缓存是否存在,如果存在就从本地缓存获取数据返还给播放器;如果不存在需要发起网络请求就先向本地写入数据,再从本地服务获取数据给播放器,从而做到数据的复用。
浅谈Android视频缓存库_第1张图片

上面的时序图,大致描述了AndroidVideoCahce内部的基本流程,但内部是如何去实现的还是一头雾水,下面具体分析下AndroidVideoCahce代码结构、AndroidVideoCahce的线程模型、有多少模块、每个模块的作用、模块之间的交互;了解完了他们,AndroidVideoCahce中的知识点基本全部掌握了。

AndroidVideoCahce代码结构

浅谈Android视频缓存库_第2张图片

file

DiskUsage: 本地磁盘文件缓存策略接口
LruDiskUsage: 根据LRU算法实现的本地磁盘文件缓存策略抽象类
TotalCountLruDiskUsage: 文件数量+LRU算法实现的本地磁盘文件缓存策略实现类
TotalSizeLruDiskUsage: 文件缓存大小+LRU算法实现的本地磁盘文件缓存策略实现类
UnlimitedDiskUsage:本地磁盘文件缓存无任何限制策略实现类

FileNameGenerator:网络资源缓存到本地文件的命名接口
Md5FileNameGenerator: 网络资源缓存到本地,本地文件根据文件的md5命名实现类

FileCache: RandomAccessFile 的封装
1. 把网络获取的数据缓存到本地
2. 把本地缓存的数据提供给播放器
3. 由于网络模块写功能、本地缓存模块读功能都需要操作同一个File,需要加锁。

headers

HeaderInjector: 添加自定义服务器请求头接口
EmptyHeadersInjector:自定义服务器请求头空实现

Sourcestorage

SourceInfoStorage: SourceInfo本地存储化接口
NoSourceInfoStorage: SourceInfo本地存储化接口的空实现
DatabaseSourceInfoStorage: SourceInfo本地存储化SQLite实现
SourceInfoStorageFactory:获取SourceInfoStorage实例的工厂

Cache

数据缓存接口;通过实现该接口我们可以把音视频数据缓存到本地文件(FileCache)或内存(ByteArrayCache)中;

Source

获取数据接口;根据数据源存储的方式(网络、本地、内存)不同,我们可以有不同的实现;

CacheListener

当前视频缓存进度回调接口

HttpUrlSource

Source接口的实现,内部通过HttpURLConnection与云端建立链接获取云端音视频数据

ByteArrayCache

数据缓存在内存中的实现

ByteArraySource

从内存中获取数据的实现

Config

业务端自定义数据的封装,AndroidVideoCahce内部会根据Config的配置使用

ProxyCache

通过封装Source、Cache接口,实现从Source中获取数据保存到Cache中;

HttpProxyCache

通过封装Source、Cache的具体实现类:HttpUrlSource、FileCache,实现从HttpUrlSource获取数据保存到FileCache中;

HttpProxyCacheServerClients

站在本地代理缓存服务的角度去看,HttpProxyCacheServerClients起到一个客户端的作用,它通过创建、封装HttpUrlSource、FileCache、HttpProxyCache、CacheListener起到一个统筹全局的作用;

HttpProxyCacheServer

内部通过ServerSocket维护一个本地服务,通过把云端的视频播放地址(url)转换为http://127.0.0.1:port/url 本地代理请求链接,这样播放器就会与我们的本地服务建立链接。然后通过HttpProxyCacheServerClients实现从云端获取数据,保存到本地,再从本地获取数据返还给播放器的逻辑。

AndroidVideoCahce模块总结

这里从功能的角度去分析下AndroidVideoCahce;主要分析AndroidVideoCahce包含哪些功能,这些功能之间是如何联系、如何协作实现视频边播边缓冲的。

数据下载模块

数据下载模块主要功能是从网络获取音视频数据到手机内存中;AndroidVideoCahce的主要实现类是HttpUrlSource;

数据本地缓存模块

数据本地缓存模块主要有两部分功能:1. 写功能: 把数据下载模块从云端获取的数据保存到本地;2. 读功能:从本地缓存中读取数据;AndroidVideoCahce的主要实现类是FileCache;

服务处理模块

服务处理模块是一个控制模块&

你可能感兴趣的:(Android,音视频,缓存,android)