# MediaSDK
关注一下分析文章:https://www.jianshu.com/p/27085da32a35
```
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.JeffMony:MediaSDK:2.0.0'
}
```
最近这个项目有新的维护计划:
> * 1.本地代理的控制逻辑移到server端
> * 2.增加mp4 moov端的识别规则
> * 3.将本地代理库和播放器解耦
### 版本LOG
2.0.0
> * 1.使用androidasync替换proxyserver
> * 2.优化MediaSDK接口
t1.5.0
> * 1.视频下载队列,可以设置视频并发下载的个数
> * 2.视频播放缓存和下载缓存的数据合并,但是逻辑分离
t1.4.0
> * 1.增加视频下载模块;
> * 2.重构本地代理模块代码;
> * 3.视频下载和本地代理模块代码复用;
> * 4.还有一些bug待处理,很快更新
> * 5.后续版本更新计划: 下载队列;初始化本地已下载的视频;下载和播放缓存隔离;
t1.3.0
> * 1.封装好边下边播模块
> * 2.可以直接商用
v1.1.0
> * 1.解决https 证书出错的视频url请求,信任证书;
> * 2.解决播放过程中息屏的问题,保持屏幕常亮;
> * 3.增加 isPlaying 接口,表示当前是否正在播放视频;
> * 4.解决Cleartext HTTP traffic to 127.0.0.1 not permitted 问题,Android P版本不允许未加密请求;
v1.0.0
> * 1.支持MediaPlayer/IjkPlayer/ExoPlayer 三种播放器播放视频;
> * 2.支持M3U8/MP4视频的边下边播功能;
> * 3.本地代理实现边下边播功能;
> * 4.提供当前下载速度和下载进度的回调;
#### 封装了一个播放器功能库
> * 实现ijkplayer exoplayer mediaplayer 3种播放器类型;可以任意切换;
> * ijkplayer 是从 k0.8.8分支上拉出来的;
> * exoplayer 是 2.11.1版本
#### 实现视频边下边播的功能
> * 缓存管理
> * 下载管理
> * 本地代理管理模块(使用androidasync管理本地代理)
> * 回调播放下载实时速度
> * 显示缓存大小
本项目的架构如下:
![](./files/LocalProxy.png)
从上面的架构可以看出来,本项目的重点在本地代理层,这是实现边下边播的核心逻辑;
### 接入库须知
#### 1.在Application->onCreate(...) 中初始化
```
File file = LocalProxyUtils.getVideoCacheDir(this);
if (!file.exists()) {
file.mkdir();
}
LocalProxyConfig config = new VideoDownloadManager.Build(this)
.setCacheRoot(file)
.setUrlRedirect(false)
.setTimeOut(DownloadConstants.READ_TIMEOUT, DownloadConstants.CONN_TIMEOUT, DownloadConstants.SOCKET_TIMEOUT)
.setConcurrentCount(DownloadConstants.CONCURRENT_COUNT)
.setIgnoreAllCertErrors(true)
.buildConfig();
VideoDownloadManager.getInstance().initConfig(config);
```
这儿可以设置一些属性:
1.setCacheRoot 设置缓存的路径;
2.setUrlRedirect 是否需要重定向请求;
3.setCacheSize 设置缓存的大小限制;
4.setTimeOut 设置连接和读超时时间;
5.setPort 设置本地代理的端口;
6.setIgnoreAllCertErrors 是否需要信任证书;
#### 2.打开本地代理开关
```
PlayerAttributes attributes = new PlayerAttributes();
attributes.setUseLocalProxy(mUseLocalProxy);
```
#### 3.设置本地代理模块监听
```
mPlayer.setOnLocalProxyCacheListener(mOnLocalProxyCacheListener);
mPlayer.startLocalProxy(mUrl, null);
private IPlayer.OnLocalProxyCacheListener mOnLocalProxyCacheListener = new IPlayer.OnLocalProxyCacheListener() {
@Override
public void onCacheReady(IPlayer mp, String proxyUrl) {
LogUtils.w("onCacheReady proxyUrl = " + proxyUrl);
Uri uri = Uri.parse(proxyUrl);
try {
mPlayer.setDataSource(PlayerActivity.this, uri);
} catch (IOException e) {
e.printStackTrace();
return;
}
mPlayer.setSurface(mSurface);
mPlayer.setOnPreparedListener(mPreparedListener);
mPlayer.setOnVideoSizeChangedListener(mVideoSizeChangeListener);
mPlayer.prepareAsync();
}
@Override
public void onCacheProgressChanged(IPlayer mp, int percent, long cachedSize) {
LogUtils.w("onCacheProgressChanged percent = " + percent);
mPercent = percent;
}
@Override
public void onCacheSpeedChanged(String url, float cacheSpeed) {
if (mPlayer != null && mPlayer.get() != null) {
mPlayer.get().notifyProxyCacheSpeed(cacheSpeed);
}
}
@Override
public void onCacheFinished(String url) {
LogUtils.i("onCacheFinished url="+url + ", player="+this);
mIsCompleteCached = true;
}
@Override
public void onCacheForbidden(String url) {
LogUtils.w("onCacheForbidden url="+url+", player="+this);
mUseLocalProxy = false;
if (mPlayer != null && mPlayer.get() != null) {
mPlayer.get().notifyProxyCacheForbidden(url);
}
}
@Override
public void onCacheFailed(String url, Exception e) {
LogUtils.w("onCacheFailed , player="+this);
pauseProxyCacheTask(PROXY_CACHE_EXCEPTION);
}
};
```
#### 4.本地代理的生命周期跟着播放器的生命周期一起
#### 5.下载接入函数
```
public interface IDownloadListener {
void onDownloadPrepare(VideoTaskItem item);
void onDownloadPending(VideoTaskItem item);
void onDownloadStart(VideoTaskItem item);
void onDownloadProxyReady(VideoTaskItem item);
void onDownloadProgress(VideoTaskItem item);
void onDownloadSpeed(VideoTaskItem item);
void onDownloadPause(VideoTaskItem item);
void onDownloadError(VideoTaskItem item);
void onDownloadProxyForbidden(VideoTaskItem item);
void onDownloadSuccess(VideoTaskItem item);
}
```
### 功能概要
#### 1.封装了一个player sdk层
> * 1.1 接入Android 原生的 MediaPlayer 播放器
> * 1.2 接入google的EXO player 播放器
> * 1.3 接入开源的 ijk player 播放器
#### 2.实现整视频的边下边播
> * 2.1 实现整视频的分片下载
> * 2.2 实现整视频的断点下载
#### 3.实现HLS分片视频的边下边播
> * 3.1 实现HLS视频源的解析工作
> * 3.2 实现HLS的边下边播
> * 3.3 实现HLS的断点下载功能
#### 4.线程池控制下载功能
#### 5.提供视频下载的额外功能
> * 5.1 可以提供播放视频或者下载视频的实时网速
> * 5.2 可以提供已缓存视频的大小
demo示意图:
![](./files/test1_low.jpg)![](./files/test2_low.jpg)
欢迎关注我的公众号JeffMony,我会持续为你带来音视频---算法---Android---python 方面的知识分享
![](./files/JeffMony.jpg)
如果你觉得这个库有用,请鼓励一下吧;
![](./files/ErWeiMa.jpg)