Skip to content

listeners

xinbaicheng edited this page Jul 24, 2017 · 2 revisions

播放器监听器

本章节主要介绍Android播放SDK提供监听器以及如果使用它们

相关页面

播放器错误码和消息定义
reload使用方法

1. OnPreparedListener

该监听器定义于IMediaPlayer
其功能是在播放器准备完成,可以开播时发出onPrepared回调,用户必须设置该监听器

正常情况下, 在收到此回调之后即可获取视频的宽高等信息, 但有多媒体文件在封装时存在问题,导致在此回调接口里获取的视频宽高为0
解决此问题的方法为设置 OnVideoSizeChangedListener 监听器,该监听器会将视频真实宽高告知用户

private KSYMediaPlayer ksyMediaPlayer;

// OnPreparedListener的定义
private IMediaPlayer.OnPreparedListener mOnPreparedListener = new IMediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(IMediaPlayer mp) {
        if(ksyMediaPlayer != null) {
            // 设置视频伸缩模式,此模式为裁剪模式
            ksyMediaPlayer.setVideoScalingMode(KSYMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
            // 开始播放视频
            ksyMediaPlayer.start();
        }
    }
}


// 设置监听器
ksyMediaPlayer.setOnPreparedListener(mOnPreparedListener);

2. OnVideoSizeChangedListener

视频宽高发生变化时会有此回调,并告知最新的视频宽高
该回调主要在以下情况会出现:

  1. 视频开播
  2. 播放过程中视频宽高发生变化

播放器在解码后发现视频的宽高发生变化,会发起此回调
对于个别特殊视频,在OnPreparedListener回调里获取的视频宽高为0,但是在解码之后即可获取视频的真实宽高,就会发起此回调

private int mVideoWidth, mVideoHeight;

private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangeListener = new IMediaPlayer.OnVideoSizeChangedListener() {
    @Override
    public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) {
        if (width > 0 && height > 0) {
            // 视频宽高发生变化
            if (width != mVideoWidth || height != mVideoHeight) {
                // 获取最新视频宽高
                mVideoWidth = width;
                mVideoHeight = height;
            }
        }
    }
};

3. OnCompletionListener

该监听器定义于IMediaPlayer
其功能是监听在播放器播放完成时发出的onCompletion回调

private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(IMediaPlayer mp) {
        // 播放完成,用户可选择释放播放器
        if(ksyMediaPlayer != null) {
            ksyMediaPlayer.release();
        }
    }
};

4. OnInfoListener

该监听器定义于IMediaPlayer
其功能是监听在播放器发出的消息通知onInfo回调,下面简要介绍较为重要的消息通知
具体的消息定义可见消息定义

public IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() {
    @Override
    public boolean onInfo(IMediaPlayer iMediaPlayer, int i, int i1) {
        switch (i) {
            case KSYMediaPlayer.MEDIA_INFO_BUFFERING_START:
                Log.d(TAG, "开始缓冲数据");
                break;
            case KSYMediaPlayer.MEDIA_INFO_BUFFERING_END:
                Log.d(TAG, "数据缓冲完毕");
                break;
            case KSYMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START:
                Toast.makeText(mContext, "开始播放音频", Toast.LENGTH_SHORT).show();
                break;
            case KSYMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                Toast.makeText(mContext, "开始渲染视频", Toast.LENGTH_SHORT).show();
                break;
            case KSYMediaPlayer.MEDIA_INFO_SUGGEST_RELOAD:
                // 播放SDK有做快速开播的优化,在流的音视频数据交织并不好时,可能只找到某一个流的信息
                // 当播放器读到另一个流的数据时会发出此消息通知
                // 请务必调用reload接口
                if(ksyMediaPlayer != null)
                    ksyMediaPlayer.reload(mDataSource, false);
                break;
            case KSYMediaPlayer.MEDIA_INFO_RELOADED:
                Toast.makeText(mContext, "reload成功的消息通知", Toast.LENGTH_SHORT).show();
                break;
        }
        return false;
    }
};

5. OnErrorListener

该监听器定义于IMediaPlayer
其功能是监听在播放器发出的错误通知onError回调
具体的错误码定义可见错误码定义

private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(IMediaPlayer mp, int what, int extra) {
        switch (what)
        {
            case KSYMediaPlayer.MEDIA_ERROR_IO:
                    //【读超时】和【链接超时】均能导致此错误的出现,用户可以选择重连
                    break;
        }
        return false;
    }
};
Clone this wiki locally