package com.netsdk.demo.example; import java.awt.Dimension; import java.awt.Toolkit; import java.io.File; import javax.swing.JWindow; /*import com.netsdk.demo.util.CaseMenu;*/ import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.EM_INTERFACE_TYPE; import com.netsdk.lib.PlaySDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.NET_DEVICEINFO_Ex; import com.netsdk.lib.PlaySDKLib.LOG_LEVEL; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class LinuxRealPlay { public static final NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; public static final PlaySDKLib netPlay = PlaySDKLib.PLAYSDK_INSTANCE; // 登陆句柄 private LLong loginHandle = new LLong(0); // 预览预览句柄 private static LLong lRealHandle = new LLong(0); // 播放通道号 private static int g_lRealPort = 0; JWindow wnd; public LinuxRealPlay(LLong loginHandle) { this.loginHandle = loginHandle; createWindow(); } //Pointer hWnd = Native.getComponentPointer(w); // 设备信息扩展 private NET_DEVICEINFO_Ex deviceInfo = new NET_DEVICEINFO_Ex(); //private NET_TIME m_startTime = new NET_TIME(); // 开始时间 //private NET_TIME m_stopTime = new NET_TIME(); // 结束时间 public void InitTest(){ // 初始化SDK库 netSdk.CLIENT_Init(DisConnectCallBack.getInstance(), null); // 设置断线重连成功回调函数 netSdk.CLIENT_SetAutoReconnect(HaveReConnectCallBack.getInstance(), null); //设置子链接重连 netSdk.CLIENT_SetSubconnCallBack(CBfSubDisConnect.getInstance(),null); //打开playsdk日志 netPlay.PLAY_SetPrintLogLevel(LOG_LEVEL.LOG_LevelDebug); //打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); String logPath = new File(".").getAbsoluteFile().getParent() + File.separator + "sdk_log" + File.separator + "sdk.log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; if (!netSdk.CLIENT_LogOpen(setLog)){ System.err.println("Open SDK Log Failed!!!"); } //Login(); } public void Login(){ // 登陆设备 wnd.setVisible(true); int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; // TCP登入 IntByReference nError = new IntByReference(0); loginHandle = netSdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword ,nSpecCap, null, deviceInfo, nError); if (loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Success!\n", m_strIp); // 初始化播放库 int bOpenRet = netPlay.PLAY_OpenStream(g_lRealPort, null, 0, 1024*500); if(bOpenRet!=0) { // 开始播放 int bPlayRet = netPlay.PLAY_Play(g_lRealPort, Native.getComponentPointer(wnd)); if(bPlayRet!=0) { // 预览预览 lRealHandle =netSdk.CLIENT_RealPlayEx(loginHandle, 0,null, 0); if(0 != lRealHandle.longValue()) { // 设置回调函数处理数据 netSdk.CLIENT_SetRealDataCallBackEx(lRealHandle, CbfRealDataCallBackEx.getInstance(),null, 31); } else { System.out.println("Fail to play!\n"); netPlay.PLAY_Stop(g_lRealPort); netPlay.PLAY_CloseStream(g_lRealPort); } } else { netPlay.PLAY_CloseStream(g_lRealPort); } } else { System.err.printf("PLAY_OpenStream failed, error: %d\n", netPlay.PLAY_GetLastError(g_lRealPort)); } } else { System.err.printf("Login Device[%s] Fail.Error[%s]\n", m_strIp, ToolKits.getErrorCode()); LoginOut(); } } /* //关闭解码库播放 public void playStop(){ if(netPlay.PLAY_Stop(g_lRealPort)!=0){ System.out.println("playStop success"); } } //释放播放库 public void playCloseStream(){ if(netPlay.PLAY_CloseStream(g_lRealPort)!=0){ System.out.println("playCloseStream success"); } } //关闭预览 public void StopRealPlayEx(){ if(netSdk.CLIENT_StopRealPlayEx(lRealHandle)){ System.out.println("playCloseStream success"); } }*/ public void LoginOut(){ System.out.println("End Test"); netPlay.PLAY_Stop(g_lRealPort); netPlay.PLAY_CloseStream(g_lRealPort); netSdk.CLIENT_StopRealPlayEx(lRealHandle); if( loginHandle.longValue() != 0) { netSdk.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netSdk.CLIENT_Cleanup(); System.exit(0); } public void createWindow() { wnd = new JWindow(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); screenSize.height /= 2; screenSize.width /= 2; wnd.setSize(screenSize); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int w = wnd.getSize().width; int h = wnd.getSize().height; int x = (dim.width - w) / 2; int y = (dim.height - h) / 2; wnd.setLocation(x, y); } /** * 设备断线回调 */ private static class DisConnectCallBack implements NetSDKLib.fDisConnect { private DisConnectCallBack() { } private static class CallBackHolder { private static DisConnectCallBack instance = new DisConnectCallBack(); } public static DisConnectCallBack getInstance() { return CallBackHolder.instance; } public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort); } } /** * 设备重连回调 */ private static class HaveReConnectCallBack implements NetSDKLib.fHaveReConnect { private HaveReConnectCallBack() { } private static class CallBackHolder { private static HaveReConnectCallBack instance = new HaveReConnectCallBack(); } public static HaveReConnectCallBack getInstance() { return CallBackHolder.instance; } public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } /** * 动态子连接断开回调函数 */ private static class CBfSubDisConnect implements NetSDKLib.fSubDisConnect { private CBfSubDisConnect() { } private static class CallBackHolder { private static CBfSubDisConnect instance = new CBfSubDisConnect(); } public static CBfSubDisConnect getInstance() { return CallBackHolder.instance; } @Override public void invoke(int emInterfaceType, Boolean bOnline, LLong lOperateHandle, LLong lLoginID, Pointer dwUser) { // TODO Auto-generated method stub switch(emInterfaceType) { case EM_INTERFACE_TYPE.DH_INTERFACE_REALPLAY: System.out.printf("实时预览接口: Short connect is %d\n", bOnline); break; case EM_INTERFACE_TYPE.DH_INTERFACE_PREVIEW: System.out.printf("多画面预览接口: Short connect is %d\n", bOnline); break; case EM_INTERFACE_TYPE.DH_INTERFACE_PLAYBACK: System.out.printf("回放接口: Short connect is %d\n", bOnline); break; case EM_INTERFACE_TYPE.DH_INTERFACE_DOWNLOAD: System.out.printf("下载接口: Short connect is %d\n", bOnline); break; default: break; } } } /** * 实时预览数据回调函数--扩展(pBuffer内存由SDK内部申请释放) */ private static class CbfRealDataCallBackEx implements NetSDKLib.fRealDataCallBackEx { private CbfRealDataCallBackEx() { } private static class CallBackHolder { private static CbfRealDataCallBackEx instance = new CbfRealDataCallBackEx(); } public static CbfRealDataCallBackEx getInstance() { return CallBackHolder.instance; } @Override public void invoke(LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) { int bInput=0; if(0 != lRealHandle.longValue()) { switch(dwDataType) { case 0: //原始音视频混合数据 bInput = netPlay.PLAY_InputData(g_lRealPort,pBuffer.getByteArray(0, dwBufSize),dwBufSize); if (0!=bInput) { System.err.printf("input data error: %d\n", netPlay.PLAY_GetLastError(g_lRealPort)); } break; case 1: //标准视频数据 break; case 2: //yuv 数据 break; case 3: //pcm 音频数据 break; case 4: //原始音频数据 break; default: break; } } } } /* public void RunTest(){ CaseMenu menu=new CaseMenu(); menu.addItem((new CaseMenu.Item(this , "playStop" , "playStop"))); menu.addItem((new CaseMenu.Item(this , "playCloseStream" , "playCloseStream"))); menu.addItem((new CaseMenu.Item(this , "StopRealPlayEx" , "StopRealPlayEx"))); menu.run(); }*/ //////////////////////////////////////////////////////////////// private String m_strIp = "172.32.100.88"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin123"; //////////////////////////////////////////////////////////////// public static void main(String []args){ final LinuxRealPlay XM=new LinuxRealPlay(lRealHandle); XM.InitTest(); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub XM.Login(); } }).start(); //XM.RunTest(); //XM.LoginOut(); } }