上一篇我们主要实现了如何介入萤石云sdk并让其正常播放。接下来实现一下如何让设备动起来。
首先,上一篇文中引用了sunshine的代码,其中handle部分是删减过的,在官网的api中可以看到,这里可以放进很多有用的回调。例如播放成功,播放失败,视频分辨率等回调:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
...
case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
//播放成功
break;
case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL:
//播放失败,得到失败信息
ErrorInfo errorinfo = (ErrorInfo) msg.obj;
//得到播放失败错误码
int code = errorinfo.errorCode;
//得到播放失败模块错误码
String codeStr = errorinfo.moduleCode;
//得到播放失败描述
String description = errorinfo.description;
//得到播放失败解决方方案
String description1 = errorinfo.sulution;
break;
case EZConstants.MSG_VIDEO_SIZE_CHANGED:
//解析出视频画面分辨率回调
try {
String temp = (String) msg.obj;
String[] strings = temp.split(":");
int mVideoWidth = Integer.parseInt(strings[0]);
int mVideoHeight = Integer.parseInt(strings[1]);
//解析出视频分辨率
} catch (Exception e) {
e.printStackTrace();
}
break;
...
}
}
};
这些回调有什么用呢?我们可以在秦子帅的博文中看到,视频放大,手势放大的监听可以放在视频播放成功的回调里。这里就不陈写出来了。然后这个handle还有另一个用武之地,那就是云台的操作。我们从官方的api可以看到,云台控制是一个耗时操作,需要放在子线程里进行,举个例子,我们要让云台向右移动,那么需要两个操作,一个是开始移动,一个是停止移动(没错,必须要有停止移动,不然它就会一直移动直到卡住。)
我们先在该handle里引用ptzOption方法。
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
...
case STOP_PTZ:
ptzOption(EZConstants.EZPTZCommand.EZPTZCommandRight, EZConstants.EZPTZAction.EZPTZActionSTOP);
break;
case START_PTZ:
ptzOption(EZConstants.EZPTZCommand.EZPTZCommandRight, EZConstants.EZPTZAction.EZPTZActionSTART);
break;
...
}
}
};
ptzOption方法主要是新开一条子线程,然后进行耗时操作。
private void ptzOption(final EZConstants.EZPTZCommand command, final EZConstants.EZPTZAction action) {
new Thread(new Runnable() {
@Override
public void run() {
boolean ptz_result = false;
try {
ptz_result = EZOpenSDK.getInstance().controlPTZ(cameraInfo00.getDeviceSerial(), cameraInfo00.getCameraNo(), command,
action, EZConstants.PTZ_SPEED_DEFAULT);
} catch (BaseException e) {
e.printStackTrace();
}
LogUtil.i(TAG, "controlPTZ ptzCtrl result: " + ptz_result);
}
}).start();
}
这样,当我们给handle发送相对应指令时,就可以操作云台移动了。可以尝试写在OnTouchListener里
private OnTouchListener mOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionevent) {
boolean ptz_result = false;
int action = motionevent.getAction();
final int speed = EZConstants.PTZ_SPEED_DEFAULT;
switch (action) {
case MotionEvent.ACTION_DOWN:
switch (view.getId()) {
case R.id.ptz_top_btn:
ptzOption(EZPTZCommand.EZPTZCommandUp, EZPTZAction.EZPTZActionSTART);
break;
case R.id.ptz_bottom_btn:
ptzOption(EZPTZCommand.EZPTZCommandDown, EZPTZAction.EZPTZActionSTART);
break;
case R.id.ptz_left_btn:
ptzOption(EZPTZCommand.EZPTZCommandLeft, EZPTZAction.EZPTZActionSTART);
break;
case R.id.ptz_right_btn:
ptzOption(EZPTZCommand.EZPTZCommandRight, EZPTZAction.EZPTZActionSTART);
break;
default:
break;
}
break;
case MotionEvent.ACTION_UP:
switch (view.getId()) {
case R.id.ptz_top_btn:
ptzOption(EZPTZCommand.EZPTZCommandUp, EZPTZAction.EZPTZActionSTOP);
break;
case R.id.ptz_bottom_btn:
ptzOption(EZPTZCommand.EZPTZCommandDown, EZPTZAction.EZPTZActionSTOP);
break;
case R.id.ptz_left_btn:
ptzOption(EZPTZCommand.EZPTZCommandLeft, EZPTZAction.EZPTZActionSTOP);
break;
case R.id.ptz_right_btn:
ptzOption(EZPTZCommand.EZPTZCommandRight, EZPTZAction.EZPTZActionSTOP);
break;
default:
break;
}
break;
default:
break;
}
return false;
}
};
这样,我们就完成了对云台的操作集成了。