package com.xx.hikvisiondemo;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
import android.view.SurfaceHolder;
import com.hikvision.netsdk.HCNetSDK;
import com.hikvision.netsdk.NET_DVR_DEVICEINFO_V30;
import com.hikvision.netsdk.NET_DVR_PREVIEWINFO;
import com.hikvision.netsdk.PTZCommand;
import com.hikvision.netsdk.PTZPresetCmd;
import com.hikvision.netsdk.RealPlayCallBack;
import org.MediaPlayer.PlayM4.Player;
import org.MediaPlayer.PlayM4.PlayerCallBack;
/**
* Created by JJT-ssd on 2016/9/23.
*/
public class CameraManager {
private final static String TAG = "HC_DEBUG";
public final static String ACTION_START_RENDERING = "action_start_rendering";
public final static String ACTION_DVR_OUTLINE = "action_dvr_outline";
/**
* 设备信息 模拟通道数bychannum 数字通道数byipchanum
*/
private NET_DVR_DEVICEINFO_V30 deviceInfo_V30 = null;
/**
* 登入标记 -1未登入,0已登入
*/
private int m_iLogID = -1;
/**
* 播放标记 -1未播放,0正在播放
*/
private int m_iPlayID = -1;
private int m_iPort = -1;
private String ip;
private int port;
private String username;
private String password;
private int channel;
private SurfaceHolder holder;
/**
* 用于发广播的上下文
*/
private Context context;
private CameraManager manager = null;
private boolean m_bStopPlayback;
public CameraManager() {
}
// public static synchronized CameraManager getInstance() {
// if (manager == null) {
// manager = new CameraManager();
// }
// return manager;
// }
/**
* 设置播放设备信息
*
* @param device
*/
public void setCameraDevice(CameraDevice device) {
this.ip = device.getIP();
this.port = Integer.parseInt(device.getPort());
this.username = device.getUserName();
this.password = device.getPassWord();
this.channel = Integer.parseInt(device.getChannel());
}
/**
* 设置播放视口
*
* @param holder
*/
public void setSurfaceHolder(SurfaceHolder holder) {
this.holder = holder;
}
/**
* 用于发送广播的上下文
*
* @param context
*/
public void setContext(Context context) {
this.context = context;
}
public void initSDK() {
if (m_iPlayID >= 0) {
stopPlay();
}
if (HCNetSDK.getInstance().NET_DVR_Init()) {
Log.i(TAG, "初始化SDK成功!");
} else {
Log.e(TAG, "初始化SDK失败!");
}
}
public void loginDevice() {
deviceInfo_V30 = new NET_DVR_DEVICEINFO_V30();
m_iLogID = HCNetSDK.getInstance().NET_DVR_Login_V30(ip, port, username,
password, deviceInfo_V30);
System.out.println("下面是设备信息************************");
System.out.println("userId=" + m_iLogID);
System.out.println("通道开始=" + deviceInfo_V30.byStartChan);
System.out.println("通道个数=" + deviceInfo_V30.byChanNum);
System.out.println("设备类型=" + deviceInfo_V30.byDVRType);
System.out.println("ip通道个数=" + deviceInfo_V30.byIPChanNum);
if (m_iLogID < 0) {
int errorCode = HCNetSDK.getInstance().NET_DVR_GetLastError();
Log.e(TAG,
"登入设备失败!" + getErrorMsg(errorCode));
} else {
Log.i(TAG, "登入设备成功!");
}
}
//preSetPosition为预设点 取1为预设点1 取2为预设点2
public synchronized void realPlay(int preSetPosition) {
try {
if (m_iLogID < 0) {
Log.e(TAG, "尝试重新登入");
int count = 0;
while (count < 10) {
Log.i(TAG, "正在第" + (count + 1) + "次重新登入");
loginDevice();
if (m_iLogID < 0) {
count++;
SystemClock.sleep(300);
} else {
Log.i(TAG, "第" + (count + 1) + "次登入成功");
break;
}
}
if (m_iLogID < 0) {
Log.e(TAG, "尝试登入" + count + "次均失败!");
return;
}
}
if (m_iPlayID < 0) {
// 预览参数配置
// NET_DVR_CLIENTINFO ClientInfo = new NET_DVR_CLIENTINFO();
NET_DVR_PREVIEWINFO ClientInfo = new NET_DVR_PREVIEWINFO();
// ClientInfo.lChannel = channel + deviceInfo_V30.byStartChan;
ClientInfo.lChannel = 0;
ClientInfo.dwStreamType = 0; // substream
ClientInfo.bBlocked = 1;
// 多播地址,需要多播预览时配置
// ClientInfo.sMultiCastIP = "";
m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(
m_iLogID, ClientInfo, getRealPlayerCallBack());
if (m_iPlayID < 0) {
int count = 0;
while (true) {
m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(
m_iLogID, ClientInfo, getRealPlayerCallBack());
if (m_iPlayID < 0) {
count++;
SystemClock.sleep(1000);
} else {
//设置默认点
gotoPreSetPoint(preSetPosition);
break;
}
}
if (m_iPlayID < 0) {
Log.e(TAG, "实时播放失败!"
+ getErrorMsg(HCNetSDK.getInstance()
.NET_DVR_GetLastError()));
if (HCNetSDK.getInstance().NET_DVR_GetLastError() == 416) {
// 发送广播
context.sendBroadcast(new Intent(ACTION_DVR_OUTLINE));
}
return;
}
} else {
Log.i(TAG, "开始实时播放!");
//设置默认点
gotoPreSetPoint(preSetPosition);
}
} else {
Log.d(TAG, "正在播放中?");
}
} catch (Exception e) {
Log.e(TAG, "异常:" + e.toString());
}
}
private void startSinglePreview() {
if (m_iPlayID >= 0) {
Log.i(TAG, "Please stop palyback first");
return;
}
RealPlayCallBack fRealDataCallBack = getRealPlayerCbf();
if (fRealDataCallBack == null) {
Log.e(TAG, "fRealDataCallBack object is failed!");
return;
}
Log.i(TAG, "m_iStartChan:" + 0);
NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();
previewInfo.lChannel = 0;
previewInfo.dwStreamType = 0; // substream
previewInfo.bBlocked = 1;
// NET_DVR_CLIENTINFO struClienInfo = new NET_DVR_CLIENTINFO();
// struClienInfo.lChannel = m_iStartChan;
// struClienInfo.lLinkMode = 0;
// HCNetSDK start preview
m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V40(m_iLogID,
previewInfo, fRealDataCallBack);
// m_iPlayID = HCNetSDK.getInstance().NET_DVR_RealPlay_V30(m_iLogID,
// struClienInfo, fRealDataCallBack, false);
if (m_iPlayID < 0) {
Log.e(TAG, "NET_DVR_RealPlay is failed!Err:"
+ HCNetSDK.getInstance().NET_DVR_GetLastError());
return;
}
Log.i(TAG,
"NetSdk Play