-
Notifications
You must be signed in to change notification settings - Fork 246
listeners
xinbaicheng edited this page Jul 24, 2017
·
2 revisions
本章节主要介绍Android播放SDK提供监听器以及如果使用它们
该监听器定义于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);
视频宽高发生变化时会有此回调,并告知最新的视频宽高
该回调主要在以下情况会出现:
- 视频开播
- 播放过程中视频宽高发生变化
播放器在解码后发现视频的宽高发生变化,会发起此回调
对于个别特殊视频,在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;
}
}
}
};
该监听器定义于IMediaPlayer
其功能是监听在播放器播放完成时发出的onCompletion回调
private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(IMediaPlayer mp) {
// 播放完成,用户可选择释放播放器
if(ksyMediaPlayer != null) {
ksyMediaPlayer.release();
}
}
};
该监听器定义于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;
}
};
该监听器定义于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;
}
};