package com.example.gsyvideoplayer.video; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.SurfaceTexture; import android.media.MediaMetadataRetriever; import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.example.gsyvideoplayer.R; import com.example.gsyvideoplayer.model.SwitchVideoModel; import com.example.gsyvideoplayer.view.SwitchVideoTypeDialog; import com.shuyu.gsyvideoplayer.GSYVideoManager; import com.shuyu.gsyvideoplayer.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.utils.GSYVideoType; import com.shuyu.gsyvideoplayer.video.GSYBaseVideoPlayer; import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * Created by shuyu on 2016/12/7. * 注意 * 这个播放器的demo配置切换到全屏播放器 * 这只是单纯的作为全屏播放显示,如果需要做大小屏幕切换,请记得在这里耶设置上视频全屏的需要的自定义配置 */ public class SampleVideo extends StandardGSYVideoPlayer { private TextView mMoreScale; private TextView mSwitchSize; private TextView mChangeRotate; private TextView mChangeTransform; private List<SwitchVideoModel> mUrlList = new ArrayList<>(); //记住切换数据源类型 private int mType = 0; private int mTransformSize = 0; //数据源 private int mSourcePosition = 0; /** * 1.5.0开始加入,如果需要不同布局区分功能,需要重载 */ public SampleVideo(Context context, Boolean fullFlag) { super(context, fullFlag); } public SampleVideo(Context context) { super(context); } public SampleVideo(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void init(Context context) { super.init(context); initView(); } private void initView() { mMoreScale = (TextView) findViewById(R.id.moreScale); mSwitchSize = (TextView) findViewById(R.id.switchSize); mChangeRotate = (TextView) findViewById(R.id.change_rotate); mChangeTransform = (TextView) findViewById(R.id.change_transform); //切换清晰度 mMoreScale.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mType == 0) { mType = 1; mMoreScale.setText("16:9"); GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_16_9); if (mTextureView != null) mTextureView.requestLayout(); } else if (mType == 1) { mType = 2; mMoreScale.setText("4:3"); GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_4_3); if (mTextureView != null) mTextureView.requestLayout(); } else if (mType == 2) { mType = 3; mMoreScale.setText("全屏"); GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_FULL); if (mTextureView != null) mTextureView.requestLayout(); } else if (mType == 3) { mType = 0; mMoreScale.setText("默认比例"); GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT); if (mTextureView != null) mTextureView.requestLayout(); } } }); //切换视频清晰度 mSwitchSize.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showSwitchDialog(); } }); //旋转播放角度 mChangeRotate.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if ((mTextureView.getRotation() - mRotate) == 270) { mTextureView.setRotation(mRotate); mTextureView.requestLayout(); mCoverImageView.setRotation(mRotate); mCoverImageView.requestLayout(); } else { mTextureView.setRotation(mTextureView.getRotation() + 90); mTextureView.requestLayout(); mCoverImageView.setRotation(mCoverImageView.getRotation() + 90); mCoverImageView.requestLayout(); } } }); //镜像旋转 mChangeTransform.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mTransformSize == 0) { mTransformSize = 1; } else if (mTransformSize == 1) { mTransformSize = 2; } else if (mTransformSize == 2) { mTransformSize = 0; } resolveTransform(); } }); } /** * 需要在尺寸发生变化的时候重新处理 */ @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { super.onSurfaceTextureSizeChanged(surface, width, height); resolveTransform(); } /** * 处理镜像旋转 */ protected void resolveTransform() { switch (mTransformSize) { case 1: { Matrix transform = new Matrix(); transform.setScale(-1, 1, mTextureView.getWidth() / 2, 0); mTextureView.setTransform(transform); mCoverImageView.setScaleType(ImageView.ScaleType.MATRIX); mCoverImageView.setImageMatrix(transform); mTransformCover = transform; mChangeTransform.setText("左右镜像"); } break; case 2: { Matrix transform = new Matrix(); transform.setScale(1, -1, 0, mTextureView.getHeight() / 2); mTextureView.setTransform(transform); mCoverImageView.setScaleType(ImageView.ScaleType.MATRIX); mCoverImageView.setImageMatrix(transform); mTransformCover = transform; mChangeTransform.setText("上下镜像"); } break; case 0: { Matrix transform = new Matrix(); transform.setScale(1, 1, mTextureView.getWidth() / 2, 0); mTextureView.setTransform(transform); mCoverImageView.setScaleType(ImageView.ScaleType.MATRIX); mCoverImageView.setImageMatrix(transform); mTransformCover = null; mChangeTransform.setText("旋转镜像"); } break; } } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param objects object[0]目前为title * @return */ public boolean setUp(List<SwitchVideoModel> url, boolean cacheWithPlay, Object... objects) { mUrlList = url; return setUp(url.get(0).getUrl(), cacheWithPlay, objects); } /** * 设置播放URL * * @param url 播放url * @param cacheWithPlay 是否边播边缓存 * @param cachePath 缓存路径,如果是M3U8或者HLS,请设置为false * @param objects object[0]目前为title * @return */ public boolean setUp(List<SwitchVideoModel> url, boolean cacheWithPlay, File cachePath, Object... objects) { mUrlList = url; return setUp(url.get(0).getUrl(), cacheWithPlay, cachePath, objects); } @Override public int getLayoutId() { return R.layout.sample_video; } @Override public GSYBaseVideoPlayer startWindowFullscreen(Context context, boolean actionBar, boolean statusBar) { SampleVideo sampleVideo = (SampleVideo) super.startWindowFullscreen(context, actionBar, statusBar); //这个播放器的demo配置切换到全屏播放器 //这只是单纯的作为全屏播放显示,如果需要做大小屏幕切换,请记得在这里耶设置上视频全屏的需要的自定义配置 //比如已旋转角度之类的等等 //可参考super中的实现 return sampleVideo; } /** * 弹出切换清晰度 */ private void showSwitchDialog() { SwitchVideoTypeDialog switchVideoTypeDialog = new SwitchVideoTypeDialog(getContext()); switchVideoTypeDialog.initList(mUrlList, new SwitchVideoTypeDialog.OnListItemClickListener() { @Override public void onItemClick(int position) { final String name = mUrlList.get(position).getName(); if (mSourcePosition != position) { if ((mCurrentState == GSYVideoPlayer.CURRENT_STATE_PLAYING || mCurrentState == GSYVideoPlayer.CURRENT_STATE_PAUSE) && GSYVideoManager.instance().getMediaPlayer() != null) { final String url = mUrlList.get(position).getUrl(); onVideoPause(); final long currentPosition = mCurrentPosition; GSYVideoManager.instance().releaseMediaPlayer(); cancelProgressTimer(); hideAllWidget(); new Handler().postDelayed(new Runnable() { @Override public void run() { setUp(url, mCache, mCachePath, mObjects); setSeekOnStart(currentPosition); startPlayLogic(); cancelProgressTimer(); hideAllWidget(); } }, 500); mSwitchSize.setText(name); mSourcePosition = position; } } else { Toast.makeText(getContext(), "已经是 " + name, Toast.LENGTH_LONG).show(); } } }); switchVideoTypeDialog.show(); } }