Android播放器开发基础(二)

Android播放器开发基础(二)

1. 播发器示例
2. 播放器开发小技巧
  1. 播发器示例

在VideoView中有开启播放视频的代码修改后如下:

注意 :MediaPlayer中没有提供当前播放位置的回调,要主动使用:getCurrentPosition()来获取;

播放器状态:从Idle状态到init状态再到prepare或者preparing状态

    /**
    * 开启视频播放
    *
    **/
    public void openVideo() {
        try {
            mMediaPlayer = new MediaPlayer();// new
            // 执行了异步准备prepareAsync()以后的回调监听
            mMediaPlayer.setOnPreparedListener(mPreparedListener);
            mIsPrepared = false;
            // video size is first known or updated 视频内容尺寸的变化回调,在第一载入和内容变化时回调
            mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
            // 视频播放完毕时的回调
            mMediaPlayer.setOnCompletionListener(mCompletionListener);
            // 播放出错时的回调
            mMediaPlayer.setOnErrorListener(mErrorListener);
            // 网络播放时的视频缓存更新时的回调
            mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
            // 播放时的状态(主要是 是否处于缓冲状态或缓冲结束状态 MEDIA_INFO_BUFFERING_START)
            // 注意:MediaPlayer中没有提供当前播放位置的回调,要主动使用:getCurrentPosition()来获取;
            mMediaPlayer.setOnInfoListener(mInfoListener);
            // 设置定位完成的监听
            mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
            if (mUri != null) {
                // 处于数据源处于init状态
                mMediaPlayer.setDataSource(mUri.toString());
                mCurrState = INITIALIZED;
                mNextState = PREPARING;
            }
            // 设置显示的位置
            mMediaPlayer.setDisplay(mSurfaceHolder);
            // 屏幕常亮
            mMediaPlayer.setScreenOnWhilePlaying(true);
            // 异步准备(处于准备中的状态)
            mMediaPlayer.prepareAsync();
            mCurrState = PREPARING;
            attachMediaController();
        } catch (IOException ex) {
            LogUtil.e(TAG, "Unable to open content: " + mUri + ex.getMessage());
            mErrorListener.onError(mMediaPlayer, -1, 0);
            return;
        } catch (IllegalArgumentException ex) {
            LogUtil.e(TAG, "Unable to open content: " + mUri + ex.getMessage());
            mErrorListener.onError(mMediaPlayer, -1, 0);
            return;
        }
    }


显示的SurfaceView的切换

需要快速从小屏幕状态切换的全屏状态则可以使用这样的方式快速切换,也不需要重新创建SurfaceView以及MediaPlayer,只是切换了显示位置

    //使用同一个MediaPlayer,通过setDisplayer更换Surface显示位置
    mediaPlayer.pause();
    mediaPlayer.setDisplay(big_surface_view.getHolder());
    mediaPlayer.start();
  1. 播放器开发小技巧
    MediaPlayer中有些操作是耗时操作,有时会时间很长,甚至会出现ANR的现象
例如:
setDataSource()
prepare()
release()
reset()
所以在做这些操作的时候需要进行异步操作,防止ARN

总结:

做播放器开发需要注意MediaPlayer的状态,大部分的播放问题是使用的当前状态下非法的操作造成的,同时播放器自身的耗时操作也会造成卡顿,需要结合业务逻辑处理。Android原生的MediaPlayer播放器在不同机器上的表现也不同,机器的硬件也会影响到视频的播放,部分机器不能很好的支持高码率的视频源,所以在视频源的选择中也需要尽量兼容到机器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值