提交 5e5ae182 编写于 作者: G guoshuyu

增加音频播放样例

上级 92d13fab
......@@ -213,6 +213,12 @@
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
<activity
android:name=".AudioDetailPlayer"
android:configChanges="keyboard|orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Transitions"
android:screenOrientation="portrait" />
<meta-data
android:name="android.max_aspect"
android:value="2.1" />
......
package com.example.gsyvideoplayer;
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.AudioSampleVideo;
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 AudioDetailPlayer extends AppCompatActivity {
@BindView(R.id.post_detail_nested_scroll)
NestedScrollView postDetailNestedScroll;
//推荐使用StandardGSYVideoPlayer,功能一致
//CustomGSYVideoPlayer部分功能处于试验阶段
@BindView(R.id.detail_player)
AudioSampleVideo 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_audio_player);
ButterKnife.bind(this);
String url = getUrl();
resolveNormalVideoUI();
//外部辅助的旋转,帮助全屏
orientationUtils = new OrientationUtils(this, detailPlayer);
//初始化不打开外部的旋转
orientationUtils.setEnable(false);
detailPlayer.loadCoverImage("", R.drawable.lololo);
Map<String, String> header = new HashMap<>();
header.put("ee", "33");
header.put("allowCrossProtocolRedirects", "true");
GSYVideoOptionBuilder gsyVideoOption = new GSYVideoOptionBuilder();
gsyVideoOption
.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(AudioDetailPlayer.this, true, 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() {
String url = "android.resource://" + getPackageName() + "/" + R.raw.test3;
//注意,用ijk模式播放raw视频,这个必须打开
GSYVideoManager.instance().enableRawPlay(getApplicationContext());
///exo raw 支持
//String url = RawResourceDataSource.buildRawResourceUri(R.raw.test).toString();
return url;
}
}
......@@ -4,8 +4,10 @@ import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
......@@ -54,7 +56,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.media_codec, R.id.detail_normal_activity, R.id.detail_download_activity})
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, R.id.detail_download_activity, R.id.detail_audio_activity})
public void onClick(View view) {
switch (view.getId()) {
case R.id.open_simple:
......@@ -165,6 +167,9 @@ public class MainActivity extends AppCompatActivity {
case R.id.detail_download_activity:
JumpUtils.goToDetailDownloadActivity(this);
break;
case R.id.detail_audio_activity:
JumpUtils.goToDetailAudioActivity(this);
break;
case R.id.clear_cache:
//清理缓存
GSYVideoManager.instance().clearAllDefaultCache(MainActivity.this);
......
......@@ -2,11 +2,14 @@ package com.example.gsyvideoplayer.utils;
import android.app.Activity;
import android.content.Intent;
import androidx.core.app.ActivityCompat;
import androidx.core.app.ActivityOptionsCompat;
import androidx.core.util.Pair;
import android.view.View;
import com.example.gsyvideoplayer.AudioDetailPlayer;
import com.example.gsyvideoplayer.AutoPlayRecyclerViewActivity;
import com.example.gsyvideoplayer.DanmkuVideoActivity;
import com.example.gsyvideoplayer.DetailADPlayer;
......@@ -224,8 +227,6 @@ public class JumpUtils {
}
/**
* 跳转到详情播放
*
......@@ -255,6 +256,7 @@ public class JumpUtils {
Intent intent = new Intent(activity, DetailNormalActivityPlayer.class);
activity.startActivity(intent);
}
/**
* 跳转到详情播放
*
......@@ -265,6 +267,16 @@ public class JumpUtils {
activity.startActivity(intent);
}
/**
* 跳转到详情播放
*
* @param activity
*/
public static void goToDetailAudioActivity(Activity activity) {
Intent intent = new Intent(activity, AudioDetailPlayer.class);
activity.startActivity(intent);
}
/**
* 跳转到详情播放
......@@ -277,7 +289,6 @@ public class JumpUtils {
}
/**
* 跳转到带广告的
*
......@@ -289,8 +300,6 @@ public class JumpUtils {
}
/**
* 跳转到详情播放
*
......
package com.example.gsyvideoplayer.video;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.example.gsyvideoplayer.R;
import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer;
public class AudioSampleVideo extends StandardGSYVideoPlayer {
ImageView mCoverImage;
String mCoverOriginUrl;
int mDefaultRes;
public AudioSampleVideo(Context context, Boolean fullFlag) {
super(context, fullFlag);
}
public AudioSampleVideo(Context context) {
super(context);
}
public AudioSampleVideo(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void init(Context context) {
super.init(context);
mCoverImage = (ImageView) findViewById(R.id.thumbImage);
if (mThumbImageViewLayout != null &&
(mCurrentState == -1 || mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR)) {
mThumbImageViewLayout.setVisibility(VISIBLE);
}
}
@Override
public int getLayoutId() {
return R.layout.audio_layout_cover;
}
public void loadCoverImage(String url, int res) {
mCoverOriginUrl = url;
mDefaultRes = res;
Glide.with(getContext().getApplicationContext())
.setDefaultRequestOptions(
new RequestOptions()
.frame(1000000)
.centerCrop()
.error(res)
.placeholder(res))
.load(url)
.into(mCoverImage);
}
@Override
public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) {
GSYBaseVideoPlayer gsyBaseVideoPlayer = super.startWindowFullscreen(context, actionBar, statusBar);
AudioSampleVideo audioSampleVideo = (AudioSampleVideo) gsyBaseVideoPlayer;
audioSampleVideo.loadCoverImage(mCoverOriginUrl, mDefaultRes);
return gsyBaseVideoPlayer;
}
@Override
public GSYBaseVideoPlayer showSmallVideo(Point size, boolean actionBar, boolean statusBar) {
//下面这里替换成你自己的强制转化
AudioSampleVideo audioSampleVideo = (AudioSampleVideo) super.showSmallVideo(size, actionBar, statusBar);
audioSampleVideo.mStartButton.setVisibility(GONE);
audioSampleVideo.mStartButton = null;
return audioSampleVideo;
}
@Override
protected void cloneParams(GSYBaseVideoPlayer from, GSYBaseVideoPlayer to) {
super.cloneParams(from, to);
AudioSampleVideo sf = (AudioSampleVideo) from;
AudioSampleVideo st = (AudioSampleVideo) to;
st.mShowFullAnimation = sf.mShowFullAnimation;
}
/**
* 退出window层播放全屏效果
*/
@SuppressWarnings("ResourceType")
@Override
protected void clearFullscreenLayout() {
if (!mFullAnimEnd) {
return;
}
mIfCurrentIsFullscreen = false;
int delay = 0;
if (mOrientationUtils != null) {
delay = mOrientationUtils.backToProtVideo();
mOrientationUtils.setEnable(false);
if (mOrientationUtils != null) {
mOrientationUtils.releaseListener();
mOrientationUtils = null;
}
}
if (!mShowFullAnimation) {
delay = 0;
}
final ViewGroup vp = (CommonUtil.scanForActivity(getContext())).findViewById(Window.ID_ANDROID_CONTENT);
final View oldF = vp.findViewById(getFullId());
if (oldF != null) {
AudioSampleVideo gsyVideoPlayer = (AudioSampleVideo) oldF;
gsyVideoPlayer.mIfCurrentIsFullscreen = false;
}
if (delay == 0) {
backToNormal();
} else {
postDelayed(new Runnable() {
@Override
public void run() {
backToNormal();
}
}, delay);
}
}
@Override
protected void addTextureView() {
}
@Override
protected void changeUiToNormal() {
super.changeUiToNormal();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPreparingShow() {
super.changeUiToPreparingShow();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPlayingShow() {
super.changeUiToPlayingShow();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPauseShow() {
super.changeUiToPauseShow();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPlayingBufferingShow() {
super.changeUiToPlayingBufferingShow();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToCompleteShow() {
super.changeUiToCompleteShow();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToError() {
super.changeUiToError();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPrepareingClear() {
super.changeUiToPrepareingClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPlayingClear() {
super.changeUiToPlayingClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPauseClear() {
super.changeUiToPauseClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToPlayingBufferingClear() {
super.changeUiToPlayingBufferingClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToClear() {
super.changeUiToClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
@Override
protected void changeUiToCompleteClear() {
super.changeUiToCompleteClear();
setViewShowState(mThumbImageViewLayout, VISIBLE);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_detail_player"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/post_detail_nested_scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/post_media_height" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/detail_text"
android:textSize="16sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<com.example.gsyvideoplayer.video.AudioSampleVideo
android:id="@+id/detail_player"
android:layout_width="match_parent"
android:layout_height="@dimen/post_media_height" />
</RelativeLayout>
......@@ -221,6 +221,12 @@
android:layout_marginTop="20dp"
android:text="自定义Exo" />
<Button
android:id="@+id/detail_audio_activity"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="音频" />
<Button
android:id="@+id/clear_cache"
android:layout_width="240dp"
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<RelativeLayout
android:id="@+id/thumb"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:background="#000000"
android:scaleType="fitCenter">
<ImageView
android:id="@+id/thumbImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/surface_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
</RelativeLayout>
<LinearLayout
android:id="@+id/layout_bottom"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#99000000"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="invisible">
<TextView
android:id="@+id/current"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:text="00:00"
android:textColor="#ffffff" />
<SeekBar
android:id="@+id/progress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1.0"
android:background="@null"
android:max="100"
android:maxHeight="4dp"
android:minHeight="4dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:progressDrawable="@drawable/video_seek_progress"
android:thumb="@drawable/video_seek_thumb" />
<TextView
android:id="@+id/total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:text="00:00"
android:textColor="#ffffff" />
<ImageView
android:id="@+id/fullscreen"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:paddingRight="16dp"
android:scaleType="center"
android:src="@drawable/video_enlarge" />
</LinearLayout>
<ProgressBar
android:id="@+id/bottom_progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_alignParentBottom="true"
android:max="100"
android:progressDrawable="@drawable/video_progress" />
<ImageView
android:id="@+id/back_tiny"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginLeft="6dp"
android:layout_marginTop="6dp"
android:visibility="gone" />
<LinearLayout
android:id="@+id/layout_top"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/video_title_bg"
android:gravity="center_vertical">
<ImageView
android:id="@+id/back"
android:layout_width="48dp"
android:layout_height="48dp"
android:paddingLeft="10dp"
android:scaleType="centerInside"
android:src="@drawable/video_back" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:textColor="@android:color/white"
android:textSize="18sp" />
</LinearLayout>
<moe.codeest.enviews.ENDownloadView
android:id="@+id/loading"
android:layout_width="28dp"
android:layout_height="28dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:visibility="invisible" />
<moe.codeest.enviews.ENPlayView
android:id="@+id/start"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_gravity="center_vertical" />
<ImageView
android:id="@+id/small_close"
android:layout_width="30dp"
android:layout_height="30dp"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:scaleType="centerInside"
android:src="@drawable/video_small_close"
android:visibility="gone" />
<ImageView
android:id="@+id/lock_screen"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="50dp"
android:scaleType="centerInside"
android:src="@drawable/unlock"
android:visibility="gone" />
</RelativeLayout>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册