Android多媒体开发系列文章

  • Android多媒体开发:录音机
  • Android多媒体开发:照相机
  • TextureView+MediaPlayer实现在线短视频播放
  • Android多媒体开发:第三方框架

TextureView+MediaPlayer实现在线短视频播放

TextureView+MediaPlayer实现在线短视频播放_第1张图片

列表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

TextureView+MediaPlayer实现在线短视频播放_第2张图片 TextureView+MediaPlayer实现在线短视频播放_第3张图片

布局文件如下

<?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

更多相关文章

  1. [置顶] YoukuParser 程序 解析优酷视频
  2. Android学习之图片异步加载框架Picasso
  3. 进击的Android之异步加载
  4. android 视频通话 项目 源码 - android大牛MrJing 活动中心 - 博
  5. 安卓视频通讯与监控系统完全版本正式发布
  6. Android -- 加载大图片的方法
  7. Mars视频笔记——ExpandableListActivity
  8. Android 9.0 Launcher Workspace 加载
  9. arcgis for Android 100.2 加载shp

随机推荐

  1. Http的15种请求
  2. Android×××方法详解
  3. [Android] Handler源码解析 (Java层)
  4. Android取得长宽的问题
  5. android WindowManager可拖动悬浮按钮
  6. Xamarin 中开发Android实现全屏或者不显
  7. Android 查询字段
  8. Android中智能控件AutoCompleteTextView
  9. Android -- 加载大图片的方法
  10. Android(安卓)第八天_重置版_服务_注意事