提交 60fb6bab 编写于 作者: S shuyu

1.3.0

上级 c94bf908
......@@ -19,13 +19,13 @@
<dependency>
<groupId>com.shuyu</groupId>
<artifactId>gsyVideoPlayer</artifactId>
<version>1.2.9</version>
<version>1.3.0</version>
<type>pom</type>
</dependency>
```
```
compile 'com.shuyu:gsyVideoPlayer:1.2.9'
compile 'com.shuyu:gsyVideoPlayer:1.3.0'
```
## 效果,录屏下的屏幕旋转和实际有些出入
......@@ -46,6 +46,56 @@ compile 'com.shuyu:gsyVideoPlayer:1.2.9'
<img src="https://github.com/CarGuo/GSYVideoPlayer/blob/master/04.gif" width="240px" height="426px"/>
### 1.3.0 支持配置缓存路径,添加了ListVideoUtils的一些接口
正常模式
```
//默认缓存路径方式
holder.gsyVideoPlayer.setUp(url, true, , ""));
···
//一个列表的视频缓存路径相同
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
···
//如果一个列表里的缓存路径不同,需要用下方的方式
holder.gsyVideoPlayer.initUIState();
//如果设置了点击封面可以播放,如果缓存列表路径不一致,还需要设置封面点击
holder.gsyVideoPlayer.setThumbPlay(true);
holder.gsyVideoPlayer.getStartButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
holder.gsyVideoPlayer.getThumbImageViewLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
```
ListVideoUtils
```
public void setCachePath(File cachePath)
public void setObjects(Object[] objects)
public void setMapHeadData(Map<String, String> mapHeadData)
```
### 1.2.9 增加了下载速度的接口
```
......
......@@ -13,9 +13,12 @@ import android.widget.ImageView;
import com.example.gsyvideoplayer.listener.OnTransitionListener;
import com.shuyu.gsyvideoplayer.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.utils.FileUtils;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
import java.io.File;
import butterknife.BindView;
import butterknife.ButterKnife;
......@@ -46,7 +49,9 @@ public class PlayActivity extends AppCompatActivity {
private void init() {
String url = "http://baobab.wdjcdn.com/14564977406580.mp4";
videoPlayer.setUp(url, true, "");
//需要路径的
videoPlayer.setUp(url, true, new File(FileUtils.getPath()), "");
//videoPlayer.setUp(url, true, "");
//增加封面
ImageView imageView = new ImageView(this);
......
......@@ -14,11 +14,15 @@ import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.listener.StandardVideoAllCallBack;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.FileUtils;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.shuyu.gsyvideoplayer.GSYVideoPlayer.CURRENT_STATE_NORMAL;
/**
* Created by shuyu on 2016/11/12.
*/
......@@ -78,7 +82,35 @@ public class ListNormalAdapter extends BaseAdapter {
final String url = "http://baobab.wdjcdn.com/14564977406580.mp4";
holder.gsyVideoPlayer.setUp(url, true, "");
//默认缓存路径
//holder.gsyVideoPlayer.setUp(url, true, , ""));
//如果一个列表的缓存路劲都一一致
//holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
//如果一个列表里的缓存路劲不一致
holder.gsyVideoPlayer.initUIState();
//如果设置了点击封面可以播放,如果缓存列表路径不一致,还需要设置封面点击
holder.gsyVideoPlayer.setThumbPlay(true);
holder.gsyVideoPlayer.getStartButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
holder.gsyVideoPlayer.getThumbImageViewLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//需要切换缓存路径的
holder.gsyVideoPlayer.setUp(url, true, new File(FileUtils.getTestPath(), ""));
holder.gsyVideoPlayer.startPlayLogic();
}
});
//增加title
holder.gsyVideoPlayer.getTitleTextView().setVisibility(View.GONE);
......@@ -119,7 +151,7 @@ public class ListNormalAdapter extends BaseAdapter {
}
//小窗口关闭被点击的时候回调处理回复页面
SampleListener sampleListener = new SampleListener(){
SampleListener sampleListener = new SampleListener() {
@Override
public void onPrepared(String url, Object... objects) {
super.onPrepared(url, objects);
......
......@@ -11,8 +11,11 @@ import android.widget.ImageView;
import com.example.gsyvideoplayer.R;
import com.example.gsyvideoplayer.model.VideoModel;
import com.shuyu.gsyvideoplayer.listener.StandardVideoAllCallBack;
import com.shuyu.gsyvideoplayer.utils.FileUtils;
import com.shuyu.gsyvideoplayer.utils.ListVideoUtil;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
......@@ -89,6 +92,7 @@ public class ListVideoAdapter extends BaseAdapter {
listVideoUtil.setLoop(true);
listVideoUtil.setPlayPositionAndTag(position, TAG);
final String url = "http://baobab.wdjcdn.com/14564977406580.mp4";
listVideoUtil.setCachePath(new File(FileUtils.getPath()));
listVideoUtil.startPlay(url);
}
});
......
......@@ -18,7 +18,7 @@ org.gradle.jvmargs=-Xmx1536m
BINTRAY_USER=
BINTRAY_KEY=
PROJ_GROUP=com.shuyu
PROJ_VERSION=1.2.9
PROJ_VERSION=1.3.0
PROJ_NAME=gsyVideo
PROJ_WEBSITEURL=hhttps://github.com/CarGuo/GSYVideoPlayer
PROJ_ISSUETRACKERURL=
......
......@@ -14,6 +14,7 @@ import com.danikula.videocache.HttpProxyCacheServer;
import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.Map;
......@@ -48,11 +49,14 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
private HttpProxyCacheServer proxy; //视频代理
private File cacheFile;
private String playTag = ""; //播放的tag,防止错位置,因为普通的url也可能重复
private int currentVideoWidth = 0; //当前播放的视频宽的高
private int currentVideoHeight = 0; //当前播放的视屏的高
private int lastState;//当前视频的最后状态
private String playTag = ""; //播放的tag,防止错位置,因为普通的url也可能重复
private int playPosition = -22; //播放的tag,防止错位置,因为普通的url也可能重复
......@@ -72,6 +76,52 @@ public class GSYVideoManager implements IMediaPlayer.OnPreparedListener, IMediaP
GSYVideoManager.instance().newProxy(context)) : proxy;
}
/**
* 获取缓存代理服务,带文件目录的
*/
public static HttpProxyCacheServer getProxy(Context context, File file) {
//如果为空,返回默认的
if (file == null) {
return getProxy(context);
}
//如果已经有缓存文件路径,那么判断缓存文件路径是否一致
if (GSYVideoManager.instance().cacheFile != null
&& !GSYVideoManager.instance().cacheFile.getAbsolutePath().equals(file.getAbsolutePath())) {
//不一致先关了旧的
HttpProxyCacheServer proxy = GSYVideoManager.instance().proxy;
if (proxy != null) {
proxy.shutdown();
}
//开启新的
return (GSYVideoManager.instance().proxy =
GSYVideoManager.instance().newProxy(context, file));
} else {
//还没有缓存文件的或者一致的,返回原来
HttpProxyCacheServer proxy = GSYVideoManager.instance().proxy;
return proxy == null ? (GSYVideoManager.instance().proxy =
GSYVideoManager.instance().newProxy(context, file)) : proxy;
}
}
/**
* 创建缓存代理服务,带文件目录的.
*/
private HttpProxyCacheServer newProxy(Context context, File file) {
if (!file.exists()) {
file.mkdirs();
}
HttpProxyCacheServer.Builder builder = new HttpProxyCacheServer.Builder(context);
builder.cacheDirectory(file);
cacheFile = file;
return builder.build();
}
/**
* 创建缓存代理服务
*/
......
......@@ -27,6 +27,7 @@ import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.video.GSYBaseVideoPlayer;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
......@@ -77,8 +78,8 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
protected Surface mSurface;
protected ImageView mBackButton;
protected Map<String, String> mMapHeadData = new HashMap<>();
protected ProgressTimerTask mProgressTimerTask;
protected AudioManager mAudioManager; //音频焦点的监听
protected Handler mHandler = new Handler();
......@@ -187,43 +188,60 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
* @return
*/
public boolean setUp(String url, boolean cacheWithPlay, Object... objects) {
mCache = cacheWithPlay;
if (isCurrentMediaListener() &&
(System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) < FULL_SCREEN_NORMAL_DELAY)
return false;
mCurrentState = CURRENT_STATE_NORMAL;
if (cacheWithPlay && url.startsWith("http") && !url.contains("127.0.0.1")) {
mOriginUrl = url;
HttpProxyCacheServer proxy = GSYVideoManager.getProxy(getContext().getApplicationContext());
url = proxy.getProxyUrl(url);
mCacheFile = (!url.startsWith("http"));
//Log.i(TAG, "mCacheFile " + mCacheFile + " " + url);
}
this.mUrl = url;
this.mObjects = objects;
setStateAndUi(CURRENT_STATE_NORMAL);
return true;
return setUp(url, cacheWithPlay, ((File) null), objects);
}
/**
* 设置播放URL
*
* @param url
* @param cacheWithPlay 是否边播边缓存
* @param cachePath 缓存路径
* @param mapHeadData
* @param objects
* @return
*/
public boolean setUp(String url, boolean cacheWithPlay, Map<String, String> mapHeadData, Object... objects) {
if (setUp(url, cacheWithPlay, objects)) {
@Override
public boolean setUp(String url, boolean cacheWithPlay, File cachePath, Map<String, String> mapHeadData, Object... objects) {
if (setUp(url, cacheWithPlay, cachePath, objects)) {
this.mMapHeadData.clear();
this.mMapHeadData.putAll(mapHeadData);
if (mapHeadData != null)
this.mMapHeadData.putAll(mapHeadData);
return true;
}
return false;
}
/**
* 设置播放URL
*
* @param url
* @param cacheWithPlay 是否边播边缓存
* @param cachePath 缓存路径
* @param objects
* @return
*/
@Override
public boolean setUp(String url, boolean cacheWithPlay, File cachePath, Object... objects) {
mCache = cacheWithPlay;
mCachePath = cachePath;
if (isCurrentMediaListener() &&
(System.currentTimeMillis() - CLICK_QUIT_FULLSCREEN_TIME) < FULL_SCREEN_NORMAL_DELAY)
return false;
mCurrentState = CURRENT_STATE_NORMAL;
if (cacheWithPlay && url.startsWith("http") && !url.contains("127.0.0.1")) {
mOriginUrl = url;
HttpProxyCacheServer proxy = GSYVideoManager.getProxy(getContext().getApplicationContext(), cachePath);
url = proxy.getProxyUrl(url);
mCacheFile = (!url.startsWith("http"));
}
this.mUrl = url;
this.mObjects = objects;
setStateAndUi(CURRENT_STATE_NORMAL);
return true;
}
/**
* 设置播放显示状态
*
......@@ -735,7 +753,7 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
if (mLooping && percent == 0 && mProgressBar.getProgress() > 3) {
loopSetProgressAndTime();
}
Debuger.printfLog("Net speed: " + getNetSpeedText());
Debuger.printfLog("Net speed: " + getNetSpeedText());
}
}
......
package com.shuyu.gsyvideoplayer.utils;
import android.os.Environment;
import java.io.File;
public class FileUtils {
private static final String SD_PATH = Environment.getExternalStorageDirectory().getPath();
public static final String NAME = "GSYVideo";
public static final String NAME_TEST = "GSYVideoTest";
public static String getAppPath(String name) {
StringBuilder sb = new StringBuilder();
sb.append(SD_PATH);
sb.append(File.separator);
sb.append(name);
sb.append(File.separator);
return sb.toString();
}
public static String getPath() {
return getAppPath(NAME);
}
public static String getTestPath() {
return getAppPath(NAME_TEST);
}
}
\ No newline at end of file
......@@ -17,6 +17,9 @@ import com.shuyu.gsyvideoplayer.video.GSYBaseVideoPlayer;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
import com.transitionseverywhere.TransitionManager;
import java.io.File;
import java.util.Map;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getActionBarHeight;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getStatusBarHeight;
......@@ -37,6 +40,11 @@ public class ListVideoUtil {
private StandardVideoAllCallBack videoAllCallBack;
private String url;
private Context context;
private File cachePath;
private Object[] objects;
private Map<String, String> mapHeadData;
private int playPosition = -1; // 播放的位置
private int speed = 1; // 播放速度,仅支持6.0
......@@ -120,7 +128,7 @@ public class ListVideoUtil {
gsyVideoPlayer.setSpeed(speed);
gsyVideoPlayer.setUp(url, true, "");
gsyVideoPlayer.setUp(url, true, cachePath, mapHeadData, objects);
//增加title
gsyVideoPlayer.getTitleTextView().setVisibility(View.GONE);
......@@ -530,6 +538,34 @@ public class ListVideoUtil {
this.speed = speed;
}
public File getCachePath() {
return cachePath;
}
/**
* 缓存的路径
*/
public void setCachePath(File cachePath) {
this.cachePath = cachePath;
}
public Object[] getObjects() {
return objects;
}
public void setObjects(Object[] objects) {
this.objects = objects;
}
public Map<String, String> getMapHeadData() {
return mapHeadData;
}
public void setMapHeadData(Map<String, String> mapHeadData) {
this.mapHeadData = mapHeadData;
}
/**
* 获取当前播放进度
*/
......
......@@ -25,7 +25,9 @@ import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.transitionseverywhere.TransitionManager;
import java.io.File;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getActionBarHeight;
......@@ -79,6 +81,8 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
protected Object[] mObjects;
protected File mCachePath;
protected ViewGroup mTextureViewContainer; //渲染控件父类
protected View mSmallClose; //小窗口关闭按键
......@@ -87,6 +91,8 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
private OrientationUtils mOrientationUtils; //旋转工具类
protected Map<String, String> mMapHeadData = new HashMap<>();
private Handler mHandler = new Handler();
......@@ -256,7 +262,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
resolveFullVideoShow(context, gsyVideoPlayer);
}
gsyVideoPlayer.setUp(mUrl, mCache, mObjects);
gsyVideoPlayer.setUp(mUrl, mCache, mCachePath, mMapHeadData, mObjects);
gsyVideoPlayer.setStateAndUi(mCurrentState);
gsyVideoPlayer.addTextureView();
......@@ -375,7 +381,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
vp.addView(frameLayout, lpParent);
gsyVideoPlayer.setUp(mUrl, mCache, mObjects);
gsyVideoPlayer.setUp(mUrl, mCache, mCachePath, mMapHeadData, mObjects);
gsyVideoPlayer.setStateAndUi(mCurrentState);
gsyVideoPlayer.addTextureView();
//隐藏掉所有的弹出状态哟
......@@ -431,7 +437,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
* @param objects
* @return
*/
public abstract boolean setUp(String url, boolean cacheWithPlay, Object... objects);
public abstract boolean setUp(String url, boolean cacheWithPlay, File cachePath, Object... objects);
/**
* 设置播放URL
......@@ -443,7 +449,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
* @return
*/
public abstract boolean setUp(String url, boolean cacheWithPlay, Map<String, String> mapHeadData, Object... objects);
public abstract boolean setUp(String url, boolean cacheWithPlay, File cachePath, Map<String, String> mapHeadData, Object... objects);
/**
* 设置播放显示状态
......@@ -462,6 +468,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
**/
protected abstract void setSmallVideoTextureView(View.OnTouchListener onTouchListener);
protected abstract void onClickUiToggle();
/**
......
......@@ -30,6 +30,8 @@ import com.shuyu.gsyvideoplayer.listener.StandardVideoAllCallBack;
import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import java.io.File;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
......@@ -86,6 +88,7 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
private int mDialogProgressNormalColor = -11;
private boolean mThumbPlay;//是否点击封面播放
public void setStandardVideoAllCallBack(StandardVideoAllCallBack standardVideoAllCallBack) {
this.mStandardVideoAllCallBack = standardVideoAllCallBack;
......@@ -134,9 +137,15 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
@Override
public boolean setUp(String url, boolean cacheWithPlay, Object... objects) {
if (objects.length == 0) return false;
if (super.setUp(url, cacheWithPlay, objects)) {
mTitleTextView.setText(objects[0].toString());
return setUp(url, cacheWithPlay, (File) null, objects);
}
@Override
public boolean setUp(String url, boolean cacheWithPlay, File cachePath, Object... objects) {
if (super.setUp(url, cacheWithPlay, cachePath, objects)) {
if (objects != null && objects.length > 0) {
mTitleTextView.setText(objects[0].toString());
}
if (mIfCurrentIsFullscreen) {
mFullscreenButton.setImageResource(R.drawable.video_shrink);
} else {
......@@ -225,6 +234,9 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
super.onClick(v);
int i = v.getId();
if (i == R.id.thumb) {
if (!mThumbPlay) {
return;
}
if (TextUtils.isEmpty(mUrl)) {
Toast.makeText(getContext(), getResources().getString(R.string.no_url), Toast.LENGTH_SHORT).show();
return;
......@@ -638,6 +650,13 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
return gsyBaseVideoPlayer;
}
/**
* 初始化为正常状态
*/
public void initUIState() {
setStateAndUi(CURRENT_STATE_NORMAL);
}
private void startDismissControlViewTimer() {
cancelDismissControlViewTimer();
DISSMISS_CONTROL_VIEW_TIMER = new Timer();
......@@ -757,4 +776,17 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
mDialogProgressNormalColor = normalColor;
}
/**
* 是否点击封面可以播放
*/
public void setThumbPlay(boolean thumbPlay) {
this.mThumbPlay = thumbPlay;
}
/**
* 封面布局
*/
public RelativeLayout getThumbImageViewLayout() {
return mThumbImageViewLayout;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册