TextureView+MediaPlayer实现在线短视频播放
16lz
2021-01-23
Android多媒体开发系列文章
- Android多媒体开发:录音机
- Android多媒体开发:照相机
- TextureView+MediaPlayer实现在线短视频播放
- Android多媒体开发:第三方框架
TextureView+MediaPlayer实现在线短视频播放
列表item布局文件
<?xml version="1.0" encoding="utf-8"?>
其中VideoPlayer是自定义View,继承于RelativeLayout,是视频播放的关键类
VideoPlayer
public VideoPlayer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } //初始化布局 private void initView() { View view = View.inflate(getContext(), R.layout.video_play, this); ButterKnife.bind(this,view); ... }
<?xml version="1.0" encoding="utf-8"?>
实现视频播放功能的是TextureView,VideoMediaController视频播放控制器,自定义View,继承于RelativeLayout
视频播放(视频的初始化)
private void play(String url){ try { mPlayer = MediaHelper.getInstance(); mPlayer.reset(); mPlayer.setDataSource(url); //让MediaPlayer和TextureView进行视频画面的结合 mPlayer.setSurface(mSurface); //设置监听 mPlayer.setOnBufferingUpdateListener(onBufferingUpdateListener); mPlayer.setOnCompletionListener(onCompletionListener); mPlayer.setOnErrorListener(onErrorListener); mPlayer.setOnPreparedListener(onPreparedListener); mPlayer.setScreenOnWhilePlaying(true);//在视频播放的时候保持屏幕的高亮 //异步准备 mPlayer.prepareAsync(); } catch (Exception e) { e.printStackTrace(); } }
准备完成监听
private MediaPlayer.OnPreparedListener onPreparedListener = new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { //隐藏视频加载进度条 mediaController.setPbLoadingVisiable(View.GONE); //进行视频的播放 MediaHelper.play(); hasPlay = true; //隐藏标题 mediaController.delayHideTitle(); //设置视频的总时长 mediaController.setDuration(mPlayer.getDuration()); //更新播放的时间和进度 mediaController.updatePlayTimeAndProgress(); } };
进行TextureView控件创建的监听
videoView.setSurfaceTextureListener(surfaceTextureListener);
private TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() { //创建完成 TextureView才可以进行视频画面的显示 @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { // Log.i(TAG,"onSurfaceTextureAvailable"); mSurface = new Surface(surface);//连接对象(MediaPlayer和TextureView) play(info.url); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { // Log.i(TAG,"onSurfaceTextureSizeChanged"); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { // Log.i(TAG,"onSurfaceTextureDestroyed"); return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { // Log.i(TAG,"onSurfaceTextureUpdated"); } };
VideoMediaController
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
显示或者隐藏视频控制界面
private void showOrHideVideoController() { if(llPlayControl.getVisibility() == View.GONE){ //显示(标题、播放按钮、视频进度控制) tvTitle.setVisibility(View.VISIBLE); ivPlay.setVisibility(View.VISIBLE); //加载动画 Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.bottom_enter); animation.setAnimationListener(new SimpleAnimationListener(){ @Override public void onAnimationEnd(Animation animation) { super.onAnimationEnd(animation); llPlayControl.setVisibility(View.VISIBLE); //过2秒后自动隐藏 mHandler.sendEmptyMessageDelayed(MSG_HIDE_CONTROLLER,2000); } }); //执行动画 llPlayControl.startAnimation(animation); }else{ //隐藏(标题、播放按钮、视频进度控制) tvTitle.setVisibility(View.GONE); ivPlay.setVisibility(View.GONE); //加载动画 Animation animation = AnimationUtils.loadAnimation(getContext(),R.anim.bottom_exit); animation.setAnimationListener(new SimpleAnimationListener(){ @Override public void onAnimationEnd(Animation animation) { super.onAnimationEnd(animation); llPlayControl.setVisibility(View.GONE); } }); //执行动画 llPlayControl.startAnimation(animation); } }
更新播放的时间和进度
public void updatePlayTimeAndProgress() { //获取目前播放的进度 int currentPosition = MediaHelper.getInstance().getCurrentPosition(); //格式化 String useTime = formatDuration(currentPosition); tvUseTime.setText(useTime); //更新进度 int duration = MediaHelper.getInstance().getDuration(); if(duration == 0){ return; } int progress = 100*currentPosition/duration; seekBar.setProgress(progress); //发送一个更新的延时消息 mHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME_PROGRESS,500); }
自定义SeekBar
sb_progress_drawable
<?xml version="1.0" encoding="utf-8"?> -
-
-
-
列表的item滚动出屏幕时停止播放
private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } //进行滑动 @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //获取屏幕上显示的第一个条目和最后一个条目的下标 int firstVisibleItemPosition = lm.findFirstVisibleItemPosition(); int lastVisibleItemPosition = lm.findLastVisibleItemPosition(); //获取播放条目的下标 int currentPosition = adapter.currentPosition; if((firstVisibleItemPosition > currentPosition || lastVisibleItemPosition < currentPosition) && currentPosition > -1){ //让播放隐藏的条目停止 MediaHelper.release(); adapter.currentPosition = -1; adapter.notifyDataSetChanged(); } } };
代码:https://github.com/JackChan1999/VideoPlayer
更多相关文章
- [置顶] YoukuParser 程序 解析优酷视频
- Android学习之图片异步加载框架Picasso
- 进击的Android之异步加载
- android 视频通话 项目 源码 - android大牛MrJing 活动中心 - 博
- 安卓视频通讯与监控系统完全版本正式发布
- Android -- 加载大图片的方法
- Mars视频笔记——ExpandableListActivity
- Android 9.0 Launcher Workspace 加载
- arcgis for Android 100.2 加载shp