提交 23356a23 编写于 作者: S shuyu

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	gsyVideoPlayer/build.gradle
......@@ -18,10 +18,12 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
......@@ -31,166 +33,178 @@
</activity>
<activity
android:name=".PlayActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".ListVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".ListVideo2Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".DetailPlayer"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".RecyclerView2Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailListPlayer"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".WebDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".RecyclerViewActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DanmkuVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".FragmentVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailMoreTypeActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".InputUrlDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".PlayEmptyControlActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailControlActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailFilterActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".PlayPickActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".AutoPlayRecyclerViewActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".ScrollingActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:label="@string/title_activity_scrolling"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".WindowActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".EmptyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".utils.floatUtil.FloatActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailADPlayer"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".DetailADPlayer2"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".ListMultiVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".ListADVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".ListADVideoActivity2"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name=".exo.DetailExoListPlayer"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimplePlayer"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Full"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimpleDetailActivityMode1"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimpleDetailActivityMode2"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimpleListVideoActivityMode1"
android:theme="@style/Theme.AppCompat.Translucent"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimpleListVideoActivityMode2"
android:theme="@style/Theme.AppCompat.Translucent"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".simple.SimpleActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".switchplay.SwitchListVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
<activity
android:name=".switchplay.SwitchDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
<activity
android:name=".RecyclerView3Activity"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
<activity
android:name=".DetailNormalActivityPlayer"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
......
......@@ -41,13 +41,13 @@ public class DetailADPlayer extends GSYBaseActivityDetail<ListGSYVideoPlayer> {
ArrayList<GSYSampleADVideoPlayer.GSYADVideoModel> urls = new ArrayList<>();
//广告1
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4",
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4",
"", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_AD));
//正式内容1
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4",
"正文1标题", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_NORMAL));
//广告2
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4",
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4",
"", GSYSampleADVideoPlayer.GSYADVideoModel.TYPE_AD, true));
//正式内容2
urls.add(new GSYSampleADVideoPlayer.GSYADVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f30.mp4",
......
......@@ -21,9 +21,9 @@ public class DetailADPlayer2 extends GSYBaseADActivityDetail<NormalGSYVideoPlaye
private GSYADVideoPlayer adPlayer;
private String urlAd = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
private String urlAd = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
private String urlAd2 = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
private String urlAd2 = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
private String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
......@@ -103,6 +103,7 @@ public class DetailADPlayer2 extends GSYBaseADActivityDetail<NormalGSYVideoPlaye
/**
* 需要片头广告
* 如果返回 false ,setStartAfterPrepared 需要设置为 ture
*/
@Override
public boolean isNeedAdOnStart() {
......
......@@ -48,7 +48,7 @@ public class DetailListPlayer extends GSYBaseActivityDetail<ListGSYVideoPlayer>
//String url = "http://baobab.wd jcdn.com/14564977406580.mp4";
List<GSYVideoModel> urls = new ArrayList<>();
urls.add(new GSYVideoModel("http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4", "标题1"));
urls.add(new GSYVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4", "标题1"));
urls.add(new GSYVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4", "标题2"));
urls.add(new GSYVideoModel("https://res.exexm.com/cw_145225549855002", "标题3"));
urls.add(new GSYVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4", "标题4"));
......
package com.example.gsyvideoplayer;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.NestedScrollView;
import com.example.gsyvideoplayer.video.LandLayoutVideo;
import com.google.android.exoplayer2.SeekParameters;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
import com.shuyu.gsyvideoplayer.listener.GSYVideoProgressListener;
import com.shuyu.gsyvideoplayer.listener.LockClickListener;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
import tv.danmaku.ijk.media.exo2.Exo2PlayerManager;
public class DetailNormalActivityPlayer extends Activity {
@BindView(R.id.post_detail_nested_scroll)
NestedScrollView postDetailNestedScroll;
//推荐使用StandardGSYVideoPlayer,功能一致
//CustomGSYVideoPlayer部分功能处于试验阶段
@BindView(R.id.detail_player)
LandLayoutVideo detailPlayer;
@BindView(R.id.activity_detail_player)
RelativeLayout activityDetailPlayer;
private boolean isPlay;
private boolean isPause;
private OrientationUtils orientationUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_player);
ButterKnife.bind(this);
String url = getUrl();
//增加封面
ImageView imageView = new ImageView(this);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageResource(R.mipmap.xxx1);
resolveNormalVideoUI();
//外部辅助的旋转,帮助全屏
orientationUtils = new OrientationUtils(this, detailPlayer);
//初始化不打开外部的旋转
orientationUtils.setEnable(false);
Map<String, String> header = new HashMap<>();
header.put("ee", "33");
header.put("allowCrossProtocolRedirects", "true");
GSYVideoOptionBuilder gsyVideoOption = new GSYVideoOptionBuilder();
gsyVideoOption.setThumbImageView(imageView)
.setIsTouchWiget(true)
.setRotateViewAuto(false)
.setLockLand(false)
.setAutoFullWithSize(false)
.setShowFullAnimation(false)
.setNeedLockFull(true)
.setUrl(url)
.setMapHeadData(header)
.setCacheWithPlay(false)
.setVideoTitle("测试视频")
.setVideoAllCallBack(new GSYSampleCallBack() {
@Override
public void onPrepared(String url, Object... objects) {
Debuger.printfError("***** onPrepared **** " + objects[0]);
Debuger.printfError("***** onPrepared **** " + objects[1]);
super.onPrepared(url, objects);
//开始播放了才能旋转和全屏
orientationUtils.setEnable(true);
isPlay = true;
//设置 seek 的临近帧。
if(detailPlayer.getGSYVideoManager().getPlayer() instanceof Exo2PlayerManager) {
((Exo2PlayerManager) detailPlayer.getGSYVideoManager().getPlayer()).setSeekParameter(SeekParameters.NEXT_SYNC);
Debuger.printfError("***** setSeekParameter **** ");
}
}
@Override
public void onEnterFullscreen(String url, Object... objects) {
super.onEnterFullscreen(url, objects);
Debuger.printfError("***** onEnterFullscreen **** " + objects[0]);//title
Debuger.printfError("***** onEnterFullscreen **** " + objects[1]);//当前全屏player
}
@Override
public void onAutoComplete(String url, Object... objects) {
super.onAutoComplete(url, objects);
}
@Override
public void onClickStartError(String url, Object... objects) {
super.onClickStartError(url, objects);
}
@Override
public void onQuitFullscreen(String url, Object... objects) {
super.onQuitFullscreen(url, objects);
Debuger.printfError("***** onQuitFullscreen **** " + objects[0]);//title
Debuger.printfError("***** onQuitFullscreen **** " + objects[1]);//当前非全屏player
if (orientationUtils != null) {
orientationUtils.backToProtVideo();
}
}
})
.setLockClickListener(new LockClickListener() {
@Override
public void onClick(View view, boolean lock) {
if (orientationUtils != null) {
//配合下方的onConfigurationChanged
orientationUtils.setEnable(!lock);
}
}
})
.setGSYVideoProgressListener(new GSYVideoProgressListener() {
@Override
public void onProgress(int progress, int secProgress, int currentPosition, int duration) {
Debuger.printfLog(" progress " + progress + " secProgress " + secProgress + " currentPosition " + currentPosition + " duration " + duration);
}
})
.build(detailPlayer);
detailPlayer.getFullscreenButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//直接横屏
orientationUtils.resolveByClick();
//第一个true是否需要隐藏actionbar,第二个true是否需要隐藏statusbar
detailPlayer.startWindowFullscreen(DetailNormalActivityPlayer.this, false, true);
}
});
}
@Override
public void onBackPressed() {
if (orientationUtils != null) {
orientationUtils.backToProtVideo();
}
if (GSYVideoManager.backFromWindowFull(this)) {
return;
}
super.onBackPressed();
}
@Override
protected void onPause() {
getCurPlay().onVideoPause();
super.onPause();
isPause = true;
}
@Override
protected void onResume() {
getCurPlay().onVideoResume(false);
super.onResume();
isPause = false;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isPlay) {
getCurPlay().release();
}
//GSYPreViewManager.instance().releaseMediaPlayer();
if (orientationUtils != null)
orientationUtils.releaseListener();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//如果旋转了就全屏
if (isPlay && !isPause) {
detailPlayer.onConfigurationChanged(this, newConfig, orientationUtils, true, true);
}
}
private void resolveNormalVideoUI() {
//增加title
detailPlayer.getTitleTextView().setVisibility(View.GONE);
detailPlayer.getBackButton().setVisibility(View.GONE);
}
private GSYVideoPlayer getCurPlay() {
if (detailPlayer.getFullWindowPlayer() != null) {
return detailPlayer.getFullWindowPlayer();
}
return detailPlayer;
}
private String getUrl() {
return "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
}
}
......@@ -14,6 +14,7 @@ import com.google.android.exoplayer2.SeekParameters;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
import com.shuyu.gsyvideoplayer.listener.GSYVideoProgressListener;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
......@@ -22,12 +23,15 @@ import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
import tv.danmaku.ijk.media.exo2.Exo2PlayerManager;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
public class DetailPlayer extends AppCompatActivity {
......@@ -70,6 +74,14 @@ public class DetailPlayer extends AppCompatActivity {
//GSYVideoManager.instance().setTimeOut(4000, true);
// VideoOptionModel videoOptionModel =
// new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
// List<VideoOptionModel> list = new ArrayList<>();
// list.add(videoOptionModel);
// VideoOptionModel videoOptionModel2 = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", -1);
// list.add(videoOptionModel2);
// GSYVideoManager.instance().setOptionModelList(list);
//增加封面
ImageView imageView = new ImageView(this);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
......
......@@ -12,6 +12,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import com.shuyu.gsyvideoplayer.player.PlayerFactory;
import com.shuyu.gsyvideoplayer.utils.GSYVideoType;
import com.squareup.leakcanary.LeakCanary;
import java.io.File;
......
......@@ -164,7 +164,7 @@ public class ListADVideoActivity extends AppCompatActivity {
final String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlAD = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
final String urlAD = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
//多个播放时必须在setUpLazy、setUp和getGSYVideoManager()等前面设置
holder.gsyVideoPlayer.setPlayTag(TAG);
......
......@@ -165,7 +165,7 @@ public class ListADVideoActivity2 extends AppCompatActivity {
final String url = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlAD = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
final String urlAD = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
//多个播放时必须在setUpLazy、setUp和getGSYVideoManager()等前面设置
holder.gsyVideoPlayer.setPlayTag(TAG);
......
......@@ -6,6 +6,7 @@ import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.transition.Explode;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.RelativeLayout;
......@@ -32,6 +33,7 @@ public class ListVideoActivity extends AppCompatActivity {
// 设置一个exit transition
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
}
......
......@@ -54,7 +54,7 @@ public class MainActivity extends AppCompatActivity {
@OnClick({R.id.open_btn, R.id.list_btn, R.id.list_btn_2, R.id.list_detail, R.id.clear_cache, R.id.recycler, R.id.recycler_2, R.id.list_detail_list, R.id.web_detail, R.id.danmaku_video, R.id.fragment_video,
R.id.more_type, R.id.input_type, R.id.open_btn_empty, R.id.open_control, R.id.open_filter, R.id.open_btn_pick, R.id.open_btn_auto, R.id.open_scroll, R.id.open_window, R.id.open_btn_ad,
R.id.open_btn_multi, R.id.open_btn_ad2, R.id.open_list_ad, R.id.open_custom_exo, R.id.open_simple, R.id.open_switch})
R.id.open_btn_multi, R.id.open_btn_ad2, R.id.open_list_ad, R.id.open_custom_exo, R.id.open_simple, R.id.open_switch, R.id.media_codec, R.id.detail_normal_activity})
public void onClick(View view) {
switch (view.getId()) {
case R.id.open_simple:
......@@ -156,6 +156,12 @@ public class MainActivity extends AppCompatActivity {
case R.id.open_switch:
JumpUtils.goToSwitch(this);
break;
case R.id.media_codec:
JumpUtils.goMediaCodec(this);
break;
case R.id.detail_normal_activity:
JumpUtils.goToDetailNormalActivity(this);
break;
case R.id.clear_cache:
//清理缓存
GSYVideoManager.instance().clearAllDefaultCache(MainActivity.this);
......
package com.example.gsyvideoplayer;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.transition.Explode;
import android.view.Window;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.gsyvideoplayer.adapter.RecyclerBaseAdapter;
import com.example.gsyvideoplayer.holder.RecyclerItemViewHolder;
import com.example.gsyvideoplayer.mediacodec.MediaCodecVideo;
import com.example.gsyvideoplayer.model.VideoModel;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack;
import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.GSYVideoHelper;
import com.shuyu.gsyvideoplayer.utils.GSYVideoType;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* MediaCodec
*
*
*
* 没有适配小窗口切换的,请悉知
*/
public class RecyclerView3Activity extends AppCompatActivity {
@BindView(R.id.list_item_recycler)
RecyclerView listItemRecycler;
@BindView(R.id.video_full_container)
FrameLayout videoFullContainer;
LinearLayoutManager linearLayoutManager;
RecyclerBaseAdapter recyclerBaseAdapter;
List<VideoModel> dataList = new ArrayList<>();
GSYVideoHelper smallVideoHelper;
GSYVideoHelper.GSYVideoHelperBuilder gsySmallVideoHelperBuilder;
int lastVisibleItem;
int firstVisibleItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 设置一个exit transition
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view2);
ButterKnife.bind(this);
initView();
listItemRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
Debuger.printfLog("firstVisibleItem " + firstVisibleItem +" lastVisibleItem " + lastVisibleItem);
//大于0说明有播放,//对应的播放列表TAG
if (smallVideoHelper.getPlayPosition() >= 0 && smallVideoHelper.getPlayTAG().equals(RecyclerItemViewHolder.TAG)) {
//当前播放的位置
int position = smallVideoHelper.getPlayPosition();
//不可视的是时候
if ((position < firstVisibleItem || position > lastVisibleItem)) {
//如果是小窗口就不需要处理
if (!smallVideoHelper.isSmall() && !smallVideoHelper.isFull()) {
//小窗口
int size = CommonUtil.dip2px(RecyclerView3Activity.this, 150);
//actionbar为true才不会掉下面去
smallVideoHelper.showSmallVideo(new Point(size, size), true, true);
}
} else {
if (smallVideoHelper.isSmall()) {
smallVideoHelper.smallVideoToNormal();
}
}
}
}
});
}
@Override
protected void onStart() {
super.onStart();
/// 打开硬解码
GSYVideoType.enableMediaCodec();
}
@Override
protected void onDestroy() {
super.onDestroy();
/// 关闭硬解码
GSYVideoType.disableMediaCodec();
smallVideoHelper.releaseVideoPlayer();
GSYVideoManager.releaseAllVideos();
}
@Override
public void onBackPressed() {
if (smallVideoHelper.backFromFull()) {
return;
}
super.onBackPressed();
}
private void initView() {
linearLayoutManager = new LinearLayoutManager(this);
listItemRecycler.setLayoutManager(linearLayoutManager);
resolveData();
recyclerBaseAdapter = new RecyclerBaseAdapter(this, dataList);
listItemRecycler.setAdapter(recyclerBaseAdapter);
smallVideoHelper = new GSYVideoHelper(this, new MediaCodecVideo(this));
smallVideoHelper.setFullViewContainer(videoFullContainer);
//配置
gsySmallVideoHelperBuilder = new GSYVideoHelper.GSYVideoHelperBuilder();
gsySmallVideoHelperBuilder
.setHideActionBar(true)
.setHideStatusBar(true)
.setNeedLockFull(true)
.setCacheWithPlay(true)
.setAutoFullWithSize(false)
.setShowFullAnimation(false)
.setLockLand(true).setVideoAllCallBack(new GSYSampleCallBack() {
@Override
public void onPrepared(String url, Object... objects) {
super.onPrepared(url, objects);
Debuger.printfLog("Duration " + smallVideoHelper.getGsyVideoPlayer().getDuration() + " CurrentPosition " + smallVideoHelper.getGsyVideoPlayer().getCurrentPositionWhenPlaying());
}
@Override
public void onQuitSmallWidget(String url, Object... objects) {
super.onQuitSmallWidget(url, objects);
//大于0说明有播放,//对应的播放列表TAG
if (smallVideoHelper.getPlayPosition() >= 0 && smallVideoHelper.getPlayTAG().equals(RecyclerItemViewHolder.TAG)) {
//当前播放的位置
int position = smallVideoHelper.getPlayPosition();
//不可视的是时候
if ((position < firstVisibleItem || position > lastVisibleItem)) {
//释放掉视频
smallVideoHelper.releaseVideoPlayer();
recyclerBaseAdapter.notifyDataSetChanged();
}
}
}
});
smallVideoHelper.setGsyVideoOptionBuilder(gsySmallVideoHelperBuilder);
recyclerBaseAdapter.setVideoHelper(smallVideoHelper, gsySmallVideoHelperBuilder);
}
private void resolveData() {
for (int i = 0; i < 19; i++) {
VideoModel videoModel = new VideoModel();
dataList.add(videoModel);
}
if (recyclerBaseAdapter != null)
recyclerBaseAdapter.notifyDataSetChanged();
}
}
......@@ -82,7 +82,7 @@ public class ListNormalAdapter extends BaseAdapter {
//final String url = "https://res.exexm.com/cw_145225549855002";
final String urlH = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlV = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
final String urlV = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
final String url = (position % 2 == 0) ? urlH : urlV;
//final String url = "http://111.198.24.133:83/yyy_login_server/pic/YB059284/97778276040859/1.mp4";
......
......@@ -45,7 +45,7 @@ public class DetailExoListPlayer extends GSYBaseActivityDetail<GSYExo2PlayerView
List<GSYVideoModel> urls = new ArrayList<>();
urls.add(new GSYVideoModel("https://media6.smartstudy.com/ae/07/3997/2/dest.m3u8", "标题3"));
urls.add(new GSYVideoModel("http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4", "标题1"));
urls.add(new GSYVideoModel("http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4", "标题1"));
urls.add(new GSYVideoModel("http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4", "标题2"));
detailPlayer.setUp(urls, 0);
......
......@@ -58,7 +58,7 @@ public class RecyclerItemViewHolder extends RecyclerItemBaseHolder {
if (position % 2 == 0) {
url = "https://res.exexm.com/cw_145225549855002";
} else {
url = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
url = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
}
//listVideoUtil.setCachePath(new File(FileUtils.getPath()));
......
package com.example.gsyvideoplayer.mediacodec;
import android.content.Context;
import android.view.ViewGroup;
import com.example.gsyvideoplayer.view.CustomTextureSurface;
import com.shuyu.gsyvideoplayer.render.GSYRenderView;
import com.shuyu.gsyvideoplayer.render.glrender.GSYVideoGLViewBaseRender;
import com.shuyu.gsyvideoplayer.render.view.GSYVideoGLView;
import com.shuyu.gsyvideoplayer.render.view.listener.IGSYSurfaceListener;
import com.shuyu.gsyvideoplayer.utils.MeasureHelper;
/**
* 自定义代理渲染层
* Created by guoshuyu on 2018/1/30.
*/
public class MediaCodecRenderView extends GSYRenderView {
@Override
public void addView(Context context, ViewGroup textureViewContainer, int rotate, IGSYSurfaceListener gsySurfaceListener, MeasureHelper.MeasureFormVideoParamsListener videoParamsListener, GSYVideoGLView.ShaderInterface effect, float[] transform, GSYVideoGLViewBaseRender customRender, int mode) {
mShowView = MediaCodecTextureView.addTextureView(context, textureViewContainer, rotate, gsySurfaceListener, videoParamsListener);
}
}
package com.example.gsyvideoplayer.mediacodec;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.SurfaceTexture;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import com.shuyu.gsyvideoplayer.listener.GSYVideoShotListener;
import com.shuyu.gsyvideoplayer.listener.GSYVideoShotSaveListener;
import com.shuyu.gsyvideoplayer.render.GSYRenderView;
import com.shuyu.gsyvideoplayer.render.glrender.GSYVideoGLViewBaseRender;
import com.shuyu.gsyvideoplayer.render.view.GSYVideoGLView;
import com.shuyu.gsyvideoplayer.render.view.IGSYRenderView;
import com.shuyu.gsyvideoplayer.render.view.listener.IGSYSurfaceListener;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.shuyu.gsyvideoplayer.utils.FileUtils;
import com.shuyu.gsyvideoplayer.utils.MeasureHelper;
import java.io.File;
/**
* 用于硬解码
* Created by shuyu on 2016/11/11.
*/
public class MediaCodecTextureView extends TextureView implements TextureView.SurfaceTextureListener, IGSYRenderView, MeasureHelper.MeasureFormVideoParamsListener {
private IGSYSurfaceListener mIGSYSurfaceListener;
private MeasureHelper.MeasureFormVideoParamsListener mVideoParamsListener;
private MeasureHelper measureHelper;
private SurfaceTexture mSaveTexture;
private Surface mSurface;
public MediaCodecTextureView(Context context) {
super(context);
init();
}
public MediaCodecTextureView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
measureHelper = new MeasureHelper(this, this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureHelper.prepareMeasure(widthMeasureSpec, heightMeasureSpec, (int) getRotation());
setMeasuredDimension(measureHelper.getMeasuredWidth(), measureHelper.getMeasuredHeight());
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
if (mSaveTexture == null) {
mSaveTexture = texture;
mSurface = new Surface(texture);
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceAvailable(mSurface);
}
} else {
setSurfaceTexture(mSaveTexture);
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceSizeChanged(mSurface, width, height);
}
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
//清空释放
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceDestroyed(mSurface);
}
return (mSaveTexture == null);
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
//如果播放的是暂停全屏了
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceUpdated(mSurface);
}
}
@Override
public IGSYSurfaceListener getIGSYSurfaceListener() {
return mIGSYSurfaceListener;
}
@Override
public void setIGSYSurfaceListener(IGSYSurfaceListener surfaceListener) {
setSurfaceTextureListener(this);
mIGSYSurfaceListener = surfaceListener;
}
@Override
public int getSizeH() {
return getHeight();
}
@Override
public int getSizeW() {
return getWidth();
}
/**
* 暂停时初始化位图
*/
@Override
public Bitmap initCover() {
Bitmap bitmap = Bitmap.createBitmap(
getSizeW(), getSizeH(), Bitmap.Config.RGB_565);
return getBitmap(bitmap);
}
/**
* 暂停时初始化位图
*/
@Override
public Bitmap initCoverHigh() {
Bitmap bitmap = Bitmap.createBitmap(
getSizeW(), getSizeH(), Bitmap.Config.ARGB_8888);
return getBitmap(bitmap);
}
/**
* 获取截图
*
* @param shotHigh 是否需要高清的
*/
@Override
public void taskShotPic(GSYVideoShotListener gsyVideoShotListener, boolean shotHigh) {
if (shotHigh) {
gsyVideoShotListener.getBitmap(initCoverHigh());
} else {
gsyVideoShotListener.getBitmap(initCover());
}
}
/**
* 保存截图
*
* @param high 是否需要高清的
*/
@Override
public void saveFrame(final File file, final boolean high, final GSYVideoShotSaveListener gsyVideoShotSaveListener) {
GSYVideoShotListener gsyVideoShotListener = new GSYVideoShotListener() {
@Override
public void getBitmap(Bitmap bitmap) {
if (bitmap == null) {
gsyVideoShotSaveListener.result(false, file);
} else {
FileUtils.saveBitmap(bitmap, file);
gsyVideoShotSaveListener.result(true, file);
}
}
};
if (high) {
gsyVideoShotListener.getBitmap(initCoverHigh());
} else {
gsyVideoShotListener.getBitmap(initCover());
}
}
@Override
public View getRenderView() {
return this;
}
@Override
public void onRenderResume() {
Debuger.printfLog(getClass().getSimpleName() + " not support onRenderResume now");
}
@Override
public void onRenderPause() {
Debuger.printfLog(getClass().getSimpleName() + " not support onRenderPause now");
}
@Override
public void releaseRenderAll() {
Debuger.printfLog(getClass().getSimpleName() + " not support releaseRenderAll now");
}
@Override
public void setRenderMode(int mode) {
Debuger.printfLog(getClass().getSimpleName() + " not support setRenderMode now");
}
@Override
public void setRenderTransform(Matrix transform) {
setTransform(transform);
}
@Override
public void setGLRenderer(GSYVideoGLViewBaseRender renderer) {
Debuger.printfLog(getClass().getSimpleName() + " not support setGLRenderer now");
}
@Override
public void setGLMVPMatrix(float[] MVPMatrix) {
Debuger.printfLog(getClass().getSimpleName() + " not support setGLMVPMatrix now");
}
/**
* 设置滤镜效果
*/
@Override
public void setGLEffectFilter(GSYVideoGLView.ShaderInterface effectFilter) {
Debuger.printfLog(getClass().getSimpleName() + " not support setGLEffectFilter now");
}
@Override
public void setVideoParamsListener(MeasureHelper.MeasureFormVideoParamsListener listener) {
mVideoParamsListener = listener;
}
@Override
public int getCurrentVideoWidth() {
if (mVideoParamsListener != null) {
return mVideoParamsListener.getCurrentVideoWidth();
}
return 0;
}
@Override
public int getCurrentVideoHeight() {
if (mVideoParamsListener != null) {
return mVideoParamsListener.getCurrentVideoHeight();
}
return 0;
}
@Override
public int getVideoSarNum() {
if (mVideoParamsListener != null) {
return mVideoParamsListener.getVideoSarNum();
}
return 0;
}
@Override
public int getVideoSarDen() {
if (mVideoParamsListener != null) {
return mVideoParamsListener.getVideoSarDen();
}
return 0;
}
public void release() {
mSaveTexture = null;
}
/**
* 添加播放的view
*/
public static MediaCodecTextureView addTextureView(Context context, ViewGroup textureViewContainer, int rotate,
final IGSYSurfaceListener gsySurfaceListener,
final MeasureHelper.MeasureFormVideoParamsListener videoParamsListener) {
if (textureViewContainer.getChildCount() > 0) {
textureViewContainer.removeAllViews();
}
MediaCodecTextureView gsyTextureView = new MediaCodecTextureView(context);
gsyTextureView.setIGSYSurfaceListener(gsySurfaceListener);
gsyTextureView.setVideoParamsListener(videoParamsListener);
gsyTextureView.setRotation(rotate);
GSYRenderView.addToParent(textureViewContainer, gsyTextureView);
return gsyTextureView;
}
}
\ No newline at end of file
package com.example.gsyvideoplayer.mediacodec;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Surface;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer;
public class MediaCodecVideo extends StandardGSYVideoPlayer {
public MediaCodecVideo(Context context, Boolean fullFlag) {
super(context, fullFlag);
}
public MediaCodecVideo(Context context) {
super(context);
}
public MediaCodecVideo(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) {
return super.startWindowFullscreen(context, actionBar, statusBar);
}
@Override
public void onSurfaceAvailable(Surface surface) {
super.onSurfaceAvailable(surface);
}
@Override
public boolean onSurfaceDestroyed(Surface surface) {
//清空释放
//setDisplay(null);
//同一消息队列中去release
//releaseSurface(surface);
return true;
}
@Override
protected void addTextureView() {
mTextureView = new MediaCodecRenderView();
mTextureView.addView(getContext(), mTextureViewContainer, mRotate, this, this, mEffectFilter, mMatrixGL, mRenderer, mMode);
}
}
......@@ -17,7 +17,7 @@ public class SimpleDetailActivityMode1 extends GSYBaseActivityDetail<StandardGSY
StandardGSYVideoPlayer detailPlayer;
private String url = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
private String url = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
@Override
protected void onCreate(Bundle savedInstanceState) {
......
......@@ -34,7 +34,7 @@ public class SimpleDetailActivityMode2 extends AppCompatActivity {
detailPlayer = (StandardGSYVideoPlayer) findViewById(R.id.detail_player);
String url = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
String url = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
//增加封面
ImageView imageView = new ImageView(this);
......
......@@ -69,7 +69,7 @@ public class SimpleListVideoModeAdapter extends BaseAdapter {
}
final String urlH = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlV = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
final String urlV = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
final String url = (position % 2 == 0) ? urlH : urlV;
if (position % 2 == 0) {
......
......@@ -70,7 +70,7 @@ public class SwitchListVideoAdapter extends BaseAdapter {
holder = (ViewHolder) convertView.getTag();
}
final String urlH = "http://9890.vod.myqcloud.com/9890_4e292f9a3dd011e6b4078980237cc3d3.f20.mp4";
final String urlV = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
final String urlV = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
final String url = (position % 2 == 0) ? urlH : urlV;
final int coverId = (position % 2 == 0) ? R.mipmap.xxx1 : R.mipmap.xxx2;
......
......@@ -15,6 +15,7 @@ import com.example.gsyvideoplayer.DetailControlActivity;
import com.example.gsyvideoplayer.DetailFilterActivity;
import com.example.gsyvideoplayer.DetailListPlayer;
import com.example.gsyvideoplayer.DetailMoreTypeActivity;
import com.example.gsyvideoplayer.DetailNormalActivityPlayer;
import com.example.gsyvideoplayer.DetailPlayer;
import com.example.gsyvideoplayer.FragmentVideoActivity;
import com.example.gsyvideoplayer.InputUrlDetailActivity;
......@@ -27,6 +28,7 @@ import com.example.gsyvideoplayer.PlayEmptyControlActivity;
import com.example.gsyvideoplayer.PlayPickActivity;
import com.example.gsyvideoplayer.R;
import com.example.gsyvideoplayer.RecyclerView2Activity;
import com.example.gsyvideoplayer.RecyclerView3Activity;
import com.example.gsyvideoplayer.RecyclerViewActivity;
import com.example.gsyvideoplayer.ScrollingActivity;
import com.example.gsyvideoplayer.WebDetailActivity;
......@@ -155,6 +157,18 @@ public class JumpUtils {
ActivityCompat.startActivity(activity, intent, activityOptions.toBundle());
}
/**
* 跳转到硬解码
*
* @param activity
*/
public static void goMediaCodec(Activity activity) {
Intent intent = new Intent(activity, RecyclerView3Activity.class);
ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(activity);
ActivityCompat.startActivity(activity, intent, activityOptions.toBundle());
}
/**
* 跳转到详情播放
*
......@@ -231,6 +245,16 @@ public class JumpUtils {
activity.startActivity(intent);
}
/**
* 跳转到详情播放
*
* @param activity
*/
public static void goToDetailNormalActivity(Activity activity) {
Intent intent = new Intent(activity, DetailNormalActivityPlayer.class);
activity.startActivity(intent);
}
/**
* 跳转到详情播放
*
......
......@@ -40,8 +40,8 @@ public class RequestListADVideoPlayer extends ListADVideoPlayer {
//模拟请求失败
onError(0, 0);
} else {
mOriginUrl = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
mUrl = "http://video.7k.cn/app_video/20171202/6c8cf3ea/v.m3u8.mp4";
mOriginUrl = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
mUrl = "http://7xjmzj.com1.z0.glb.clouddn.com/20171026175005_JObCxCE2.mp4";
mTitle = "ffff1";
}
mCache = false;
......
......@@ -195,6 +195,21 @@
android:layout_marginTop="20dp"
android:text="列表带广告模式" />
<Button
android:id="@+id/media_codec"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="硬解码支持" />
<Button
android:id="@+id/detail_normal_activity"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="普通 Activity" />
<Button
android:id="@+id/open_custom_exo"
android:layout_width="240dp"
......
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
\ No newline at end of file
......@@ -233,14 +233,17 @@ VideoOptionModel videoOptionModel = new VideoOptionModel(IjkMediaPlayer.OPT_CATE
list.add(videoOptionModel);
```
#### 18、url切换400(http与https域名共用
#### 18、url切换400/404(http与https域名共用等
```
VideoOptionModel videoOptionModel =
VideoOptionModel videoOptionModel =
new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
List<VideoOptionModel> list = new ArrayList<>();
list.add(videoOptionModel);
VideoOptionModel videoOptionModel2 = new VideoOptionModel(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", -1);
list.add(videoOptionModel2);
GSYVideoManager.instance().setOptionModelList(list);
```
#### 19、全屏与非全屏的同步问题
......
......@@ -206,6 +206,7 @@ public abstract class GSYBaseADActivityDetail<T extends GSYBaseVideoPlayer, R ex
/**
* 是否播放开始广告
* 如果返回 false ,setStartAfterPrepared 需要设置为 ture
*/
public abstract boolean isNeedAdOnStart();
}
......@@ -34,6 +34,7 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
private MeasureHelper measureHelper;
private SurfaceTexture mSaveTexture;
private Surface mSurface;
public GSYTextureView(Context context) {
......@@ -58,9 +59,17 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mSurface = new Surface(surface);
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceAvailable(mSurface);
if (mSaveTexture == null) {
Debuger.printfError("FFFFFFFFFFFF 1");
mSaveTexture = surface;
mSurface = new Surface(surface);
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceAvailable(mSurface);
}
} else {
setSurfaceTexture(mSaveTexture);
Debuger.printfError("FFFFFFFFFFFF 2");
//mSurface = new Surface(mSaveTexture);
}
}
......@@ -77,7 +86,7 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
if (mIGSYSurfaceListener != null) {
mIGSYSurfaceListener.onSurfaceDestroyed(mSurface);
}
return true;
return (mSaveTexture == null);
}
@Override
......
......@@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;
import androidx.appcompat.widget.TintContextWrapper;
import androidx.fragment.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Surface;
......@@ -124,6 +125,10 @@ public class CommonUtil {
FragmentActivity fragmentActivity = (FragmentActivity) context;
fragmentActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else if (context instanceof Activity) {
Activity activity = (Activity) context;
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
CommonUtil.getAppCompActivity(context).getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
......@@ -148,6 +153,9 @@ public class CommonUtil {
if (context instanceof FragmentActivity) {
FragmentActivity fragmentActivity = (FragmentActivity) context;
fragmentActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else if (context instanceof Activity) {
Activity activity = (Activity) context;
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
CommonUtil.getAppCompActivity(context).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
......
......@@ -11,6 +11,7 @@ import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import com.shuyu.gsyvideoplayer.R;
......@@ -192,13 +193,18 @@ public abstract class GSYBaseVideoPlayer extends GSYVideoControlView {
*/
private void saveLocationStatus(Context context, boolean statusBar, boolean actionBar) {
getLocationOnScreen(mListItemRect);
int statusBarH = getStatusBarHeight(context);
int actionBerH = getActionBarHeight((Activity) context);
if (statusBar) {
mListItemRect[1] = mListItemRect[1] - statusBarH;
}
if (actionBar) {
mListItemRect[1] = mListItemRect[1] - actionBerH;
if(context instanceof Activity) {
int statusBarH = getStatusBarHeight(context);
int actionBerH = getActionBarHeight((Activity) context);
boolean isTranslucent = ((WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS & ((Activity) context).getWindow().getAttributes().flags)
== WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Debuger.printfLog("*************isTranslucent*************** " + isTranslucent);
if (statusBar && !isTranslucent) {
mListItemRect[1] = mListItemRect[1] - statusBarH;
}
if (actionBar) {
mListItemRect[1] = mListItemRect[1] - actionBerH;
}
}
mListItemSize[0] = getWidth();
mListItemSize[1] = getHeight();
......
......@@ -50,14 +50,14 @@ dependencies {
//api "com.shuyu:gsyVideoPlayer-java:$gsyVideoVersion"
//api "com.shuyu:GSYVideoPlayer-exo2:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-armv5:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-armv7a:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-arm64:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-x64:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-x86:$gsyVideoVersion"
//api "com.shuyu:gsyVideoPlayer-armv5:$gsyVideoVersion"
//api "com.shuyu:gsyVideoPlayer-armv7a:$gsyVideoVersion"
//api "com.shuyu:gsyVideoPlayer-arm64:$gsyVideoVersion"
//api "com.shuyu:gsyVideoPlayer-x64:$gsyVideoVersion"
//api "com.shuyu:gsyVideoPlayer-x86:$gsyVideoVersion"
//更多配置版so,增加了concat,rtsp,mpeg,crypto
//api "com.shuyu:gsyVideoPlayer-ex_so:$gsyVideoVersion"
api "com.shuyu:gsyVideoPlayer-ex_so:$gsyVideoVersion"
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册