观看点播准备
-
获取 点播ID recordId
-
获取包含点播权限的access_token
工程配置
在开始使用sdk之前,我们要配置好IDE和创建基础的工程代码。相关内容在【工程配置】中有详细说明。
时序图
注:已知点播ID的情况下虚线框部分无需请求。
播放器渲染View--VodPlayerView
1 构造方法
/**
* 获取View的布局方式,需要现在XML中定义
*/
mSurfaceView = this.findViewById(R.id.surfaceview);
/**
* XML中定义,代码展示
*/
<com.vhall.player.vod.VodPlayerView
android:id="@+id/surfaceview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
2 方法说明
/**
* 设置水印
*
* @param drawable
*/
public void setWaterMark(Drawable drawable){}
/**
* 设置水印的相对位置
*
* @param gravity Gravity.LEFT
*/
public void setWaterMarkGravity(int gravity) {}
/**
* 获取截图
* @return
*/
public Bitmap getBitmap() {}
/**
* 设置清晰度
* Constants.VideoMode.DRAW_MODE_NONE 默认,铺满全屏
* Constants.VideoMode.DRAW_MODE_ASPECTFIT 等比缩放居中;
* Constants.VideoMode.DRAW_MODE_ASPECTFILL 等比拉伸居中;
*/
public void setDrawMode(int mode){}
对接流程
1.1 创建 VHVodPlayer
VHVodPlayer 是SDK中负责点播的模块,需要传入上下文,和视频渲染的View,也就是播放画面的View,SDK使用的是系统自带的SurfaceView或者VodPlayerView,将创建的Surface的实例传入VHVodPlayer即可创建。
/**
* 获取View的布局方式,需要现在XML中定义
* @Param Context 上下文
* @Param SurfaceView surfaceView的实例
*/
VHVodPlayer mPlayer = new VHVodPlayer(this);
mPlayer.setDisplay(mSurfaceView);
/**
* 添加监听事件
* 具体参考本文 事件监听
*/
mPlayer.setListener(new MyPlayer());
2 创建 VHDocument (如果没有文档可以忽略)
如果需要文档服务,请参考文档 【OPS-SDK集成】
3 开始观看
/**
* 观看录播,传递在观看点播时配置的recordId (点播ID)和AccessToken;
* @param String recordId ; // 点播ID 通过 API 调用获取
* @param String accessToken; // 发起的Token 通过 API 调用获取
*/
public void start(String recordId , String accessToken);
4 设置观看清晰度
从 IVHLivePlayer.EVENT_DPI_LIST 获取当前地址可用的分辨率,确定可用的情况下在切换
清晰度 | 描述 |
---|---|
IVHLivePlayer.DPI_SD | 低清 |
IVHLivePlayer.DPI_HD | 高清 |
IVHLivePlayer.DPI_XHD | 超清 |
IVHLivePlayer.DPI_AUDIO | 纯音频 |
IVHLivePlayer.DPI_SAME | 原画 |
/**
* 在设置清晰度时,需要先获取当前的视频可用的分辨率,确认可用的时在调用。
* @param int dpi 定义的清晰度
*/
public void.setDPI(dpi);
5 暂停观看/ 恢复观看
停止拉流,而云端的视频源还在不断地更新着 , 当重新恢复时,会从最新的时间点播放
/**
* 暂停观看/ 恢复观看
*/
public void pause();
public void resume();
6 控制播放相关API
/**
* 获取观看时长 (毫秒)
*/
public long getDuration();
/**
* 获取当前进度 (毫秒)
*/
public long getPosition();
/**
* Seek操作,通常配合SeekBai进行操作,
* @param position 跳转到position的位置播放
*/
public void seek(long position);
7 结束观看
/**
* 结束观看
*/
public void stop();
8 销毁
销毁播放器的实例
/**
* 销毁播放器并释放相关的资源。
*/
public void release();
事件处理
事件监听 | 描述 |
---|---|
VHVodPlayer.EVENT_STATUS_STARTING | 正在运行 |
VHVodPlayer.EVENT_STATUS_STARTED | 开始播放 |
VHVodPlayer.EVENT_STATUS_STOPED | 停止播放 |
VHVodPlayer.EVENT_STATUS_END | 播放结束 |
VHVodPlayer.EVENT_VIDEO_SIZE_CHANGED | 视频的宽高发生改变 |
IVHLivePlayer.EVENT_DPI_LIST | 可以的清晰度 |
IVHLivePlayer.EVENT_DPI_CHANGED | 清晰度发生改变 |
class MyPlayer implements VHPlayerListener {
@Override
public void onEvent(int event, String msg) {
switch (event) {
case VHVodPlayer.EVENT_STATUS_STARTING:
break;
case VHVodPlayer.EVENT_STATUS_STARTED:
break;
case VHVodPlayer.EVENT_STATUS_STOPED:
break;
case VHVodPlayer.EVENT_STATUS_END:
break;
case VHVodPlayer.EVENT_STATUS_WH:
break;
}
}
@Override
public void onError(int errorCode, String msg) {
}
}
示例代码:
public class VodPlayerActivity extends Activity {
private static final String TAG = "LivePlayerActivity";
private String roomId = "7a97e8c7";
private String accessToken = "vhall";
private SurfaceView mSurfaceView;
private VHVodPlayer mPlayer;
private boolean mPlaying = false;
ImageView mPlayBtn;
ProgressBar mLoadingPB;
SeekBar mSeekbar;
TextView mPosView, mMaxView;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mPlaying) {
int pos = (int) mPlayer.getPosition();
mSeekbar.setProgress(pos);
mPosView.setText(String.valueOf(pos));
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
roomId = getIntent().getStringExtra("roomid");
accessToken = getIntent().getStringExtra("token");
setContentView(R.layout.vod_layout);
mPlayBtn = (ImageView) this.findViewById(R.id.btn_play);
mLoadingPB = (ProgressBar) this.findViewById(R.id.pb_loading);
mSeekbar = (SeekBar) this.findViewById(R.id.seekbar);
mSurfaceView = (SurfaceView) this.findViewById(R.id.surfaceview);
mPosView = (TextView) this.findViewById(R.id.tv_pos);
mMaxView = (TextView) this.findViewById(R.id.tv_max);
mPlayer = new VHVodPlayer(this, mSurfaceView);
mPlayer.addListener(new MyPlayer());
mSeekbar.setOnSeekBarChangeListener(new MySeekbarListener());
handlePosition();
}
@Override
protected void onPause() {
super.onPause();
if (mPlayer != null && mPlaying)
mPlayer.pause();
}
@Override
protected void onResume() {
super.onResume();
if (mPlayer != null && mPlayer.resumeAble()) {
mPlayer.resume();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPlayer != null)
mPlayer.release();
if (timer != null) {
timer.cancel();
timer = null;
}
}
public void play(View view) {
if (mPlaying) {
mPlayer.pause();
} else {
if (mPlayer.resumeAble())
mPlayer.resume();
else
mPlayer.start(roomId, accessToken);
}
}
class MyPlayer implements VHPlayerListener {
@Override
public void onEvent(int event, String msg) {
switch (event) {
case VHVodPlayer.EVENT_STATUS_STARTING:
mLoadingPB.setVisibility(View.VISIBLE);
break;
case VHVodPlayer.EVENT_STATUS_STARTED:
int max = (int) mPlayer.getDuration();
mSeekbar.setMax(max);
mMaxView.setText(String.valueOf(max));
mLoadingPB.setVisibility(View.GONE);
mPlaying = true;
mPlayBtn.setImageResource(R.mipmap.icon_pause_bro);
break;
case VHVodPlayer.EVENT_STATUS_STOPED:
mPlaying = false;
mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
mLoadingPB.setVisibility(View.GONE);
break;
case VHVodPlayer.EVENT_STATUS_END:
mPlaying = false;
mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
mLoadingPB.setVisibility(View.GONE);
break;
case VHVodPlayer.EVENT_STATUS_WH:
break;
}
}
@Override
public void onError(int errorCode, String msg) {
mPlaying = false;
mPlayBtn.setImageResource(R.mipmap.icon_start_bro);
mLoadingPB.setVisibility(View.GONE);
Toast.makeText(VodPlayerActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
class MySeekbarListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mPosView.setText(String.valueOf(seekBar.getProgress()));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mPlayer.seek(seekBar.getProgress());
}
}
//每秒获取一下进度
Timer timer;
private void handlePosition() {
if (timer != null)
return;
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 1000, 1000);
}
}