快速开始
设置AppId(licenseId)
用户在使用SDK之前需要去百度智能云控制台申请并下载.license文件放到自己工程assets目录下,并将licenseId设置给播放器。
调用BDCloudMediaPlayer的静态方法setAppId来设置appid(licenseId):
BDCloudMediaPlayer.setAppId(appid);
初始化与设置监听
初始化播放器BDCloudMediaPlayer
BDCloudMediaPlayer mMediaPlayer = new BDCloudMediaPlayer(this.getApplicationContext());
设置监听回调
// 播放器已经解析出播放源格式时回调
mMediaPlayer.setOnPreparedListener(mPreparedListener);
// 视频宽高变化时回调, 首次解析出播放源的宽高时也会回调
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
// 播放完成时回调
mMediaPlayer.setOnCompletionListener(mCompletionListener);
// 播放出错时回调
mMediaPlayer.setOnErrorListener(mErrorListener);
// 播放器信息回调,如缓冲开始、缓冲结束
mMediaPlayer.setOnInfoListener(mInfoListener);
// 总体加载进度回调,返回为已加载进度占视频总时长的百分比
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
// seek快速调节播放位置,完成后回调
mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener);
// RTMP 或 http-flv 直播时实时 metadata 信息回调
mMediaPlayer.setOnMetadataListener(mOnMetadataListener);
直播的播放源在播放过程中,根据播放协议的不同,主播断流时可能走onCompletion回调也可能走onError回调。程序中,需要您检查主播是否完成直播,若未完成直播,自写监听器定期调用 start()
尝试继续拉流播放。
设置播放源与显示目标
设置播放源并让播放器解析准备播放
// 若想设置headers,需使用setDataSource(String url, Map<String, String> headers) 方法
mMediaPlayer.setDataSource(strVideoUrl);
// 播放器仅支持异步准备,在onPrepared回调后方可调用start()启动播放
mMediaPlayer.prepareAsync();
设置播放的显示目标
支持设置 setDisplay(SurfaceHolder holder)
/setSurface(Surface surface)
两种设置方法。设置时机一般在onSurfaceCreated/onSurfaceChanged回调函数中,拿到有效的SurfaceHolder时进行设置。
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(holder);
}
播放控制
开始播放
开始播放或者继续播放均使用start接口。调用该接口时,需保证播放器已经回调onPrepared。
mMediaPlayer.start();
暂停播放
mMediaPlayer.pause();
停止播放
mMediaPlayer.stop();
从stop到再次播放可以走如下几种调用:
- 不更换播放源:stop() --> prepareAsync() --> start() when prepared
- 更换播放源:stop() --> reset() --> setDataSource(url) --> prepareAsync() --> start() when prepared
释放播放器
mMediaPlayer.release();
释放后,重新播放需创建新的player。
属性获取
获取音视频时长
获取音视频时长,单位为毫秒
long durationInMilliSeconds = mMediaPlayer.getDuration();
获取当前播放位置
获取当前播放位置,单位为毫秒
long positionInMilliSeconds = mMediaPlayer.getCurrentPosition();
获取视频宽高
int videoWidth = mMediaPlayer.getVideoWidth();
int videoHeight = mMediaPlayer.getVideoHeight();
BDCloudVideoView控件
BDCloudVideoView
封装了BDCloudMediaPlayer
,让您可以直接使用控件的方式来播放视频。该类直接提供了源代码,如果使用,需要将源码复制到您的项目中。大多数情况下,您仅需使用而不需要修改该控件,以防升级时与新版BDCloudVideoView
不兼容。
BDCloudVideoView的接口与系统类VideoView接口非常相似,主要作用如下:
- 内置视频渲染控件(TextureView/SurfaceView均可选),并可以指定视频渲染的模式(裁剪、填充、铺满),避免您直接操作mediaplayer去渲染视图的麻烦;
- 简化了MediaPlayer的控制接口。使用
new BDCloudVideoView --> setVideoPath --> start
可以快速播放; - 封装了与BDCloudMediaPlayer几乎一样的参数设置接口。使用该控件,您不需要再跟
BDCloudMediaPlayer
交互;
BDCloudVideoView播放控制
设置新的播放源
该接口会创建一个全新的BDCloudMediaPlayer内部对象,来播放新的源。
注意:
调用stopPlayback()之前,不可多次调用该接口,以防对象泄漏。
bdCloudVideoView.setVideoPath(info.getUrl());
启动或恢复播放
bdCloudVideoView.start();
暂停播放
bdCloudVideoView.pause(); // 后续可继续调用start()来恢复播放
停止播放
该函数会释放当前的BDCloudMediaPlayer内部对象
bdCloudVideoView.stopPlayback();
释放全部资源
该函数会释放当前的BDCloudMediaPlayer内部对象和渲染目标等对象。当不再使用bdCloudVideoView对象时务必调用。
bdCloudVideoView.release();
设置播放相关参数
BDCloudVideoView
封装了BDCloudMediaPlayer
的几乎所有参数设置接口,并以相同名字命名。
注意:
下列接口,请在
bdCloudVideoView.setVideoPath
之前调用,因setVideoPath
中初始化BDCloudMediaPlayer
时,需要用到这些参数的设置。
举例:
bdCloudVideoView.setLogEnabled(boolean enabled); // 是否显示日志
bdCloudVideoView.setDecodeMode(int decodeMode); // 设置解码模式
bdCloudVideoView.setInitPlayPosition(long milliSeconds); // 设置初始播放位置
bdCloudVideoView.setUseApmDetect(boolean useApmDetect); // 是否开启APM探测;若开启,需额外嵌入APM SDK
bdCloudVideoView.setMaxProbeTime(int maxProbeTimeInMs); // 设置最大探测时长
bdCloudVideoView.setMaxProbeSize(int maxProbeSizeInBytes); // 设置最大探测的数据大小
bdCloudVideoView.setMaxCacheSizeInBytes(int sizeInBytes); // 设置最大缓存数据大小
bdCloudVideoView.setLooping(boolean isLoop); // 是否循环播放
bdCloudVideoView.setBufferTimeInMs(int milliSeconds); // 设置"加载中"触发时,缓存多长时间的数据才结束
另外,BDCloudVideoView
还可以设置显示模式:
// VIDEO_SCALING_MODE_SCALE_TO_FIT 填充,遵守宽高比,有黑边
// VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING 裁剪,遵守宽高比,无黑边,但视频边缘可能被裁剪
// VIDEO_SCALING_MODE_SCALE_TO_MATCH_PARENT 铺满,不遵守宽高比,直接铺满显示区域
bdVideoView.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT);
指定使用TextureView或SurfaceView
- TextureView在Android 4.0引入,Android 4.1真正可用(因为4.1加入了setSurfaceTexture接口,可以避免黑屏)。该控件支持动画、旋转、截图等功能。如果您的播放器在ListView或ScrollView中,TextureView是首选,否则滚动的时候可能会出现边缘闪动。但缺点是性能表现不如SurfaceView。
- SurfaceView在Android 1.0即引入,缺点是不支持旋转等动画,不宜放在有滚动条的viewgroup中。但优点是,有更好的性能,如果长时间播放视频,SurfaceView是首选。
BDCloudVideoView默认优先使用TextureView(即:4.1及以上版本使用TextureView, 老版本使用SurfaceView)。
如果您想设置不管系统版本,始终使用SurfaceView,以达到最好的性能,节省电量消耗,可将以下构造函数的第二个参数设置为false:
bdCloudVideoView = new BDCloudVideoView(Context context, boolean useTextureViewFirst);
自定义"加载中"的界面提示
默认的加载中提示为 『一个加载圈』+ 『正在缓冲...』的提示。
如果您想定制『加载中』的界面和提示信息,需要调用如下代码:
bdCloudVideoView.showCacheInfo(false);
然后,就可以在App层面自己写相关的控件,并自己控制该控件的显示与隐藏。
工程中使用BDCloudVideoView实例
初始化设置播放源并启动
BDCloudVideoView.setAK(ak);
bdVideoView = new BDCloudVideoView(this);
/**
* 注册listener
*/
bdVideoView.setOnPreparedListener(this);
bdVideoView.setOnCompletionListener(this);
bdVideoView.setOnErrorListener(this);
bdVideoView.setOnInfoListener(this);
bdVideoView.setOnBufferingUpdateListener(this);
bdVideoView.setOnPlayerStateListener(this);
bdVideoView.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT);
RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(-1, -1);
rllp.addRule(RelativeLayout.CENTER_IN_PARENT);
mViewHolder.addView(bdVideoView, rllp);
// 参见demo中的AdvancedMediaController
mediaController.setMediaPlayerControl(bdVideoView);
bdVideoView.setVideoPath(info.getUrl());
// BDCloudVideoView无prepare相关接口,允许setVideoPath后立即调用start。
bdVideoView.start();
停止并释放BDCloudVideoView所有资源
注意:不使用该VideoView时务必调用本接口。
bdVideoView.stopPlayback();
bdVideoView.release();
同一界面播放下一个新的视频源
bdVideoView.stopPlayback(); // 释放上一个视频源
bdVideoView.reSetRender(); // 清除上一个播放源的最后遗留的一帧
bdVideoView.setVideoPath(info.getUrl());
bdVideoView.start();
同一界面播放同样视频的不同分辨率链接
这种情况适用于您不同清晰度的视频是不同的播放链接时。如果不同清晰度视频在同一个链接内(即Master m3u8文件),参考进阶里面的“多码率切换”。
bdVideoView.stopPlayback(); // 释放上一个视频源
bdVideoView.setInitPlayPosition(1 * 1000); // 指定初始播放位置,单位为毫秒
bdVideoView.setVideoPath(info.getUrl());
bdVideoView.start();
详细代码参见demo中的AdvancedPlayActivity.java或SimplePlayActivity.java