package com.netsdk.demo.units; import java.io.File; import com.netsdk.demo.customize.SDSnap.SnapCallback; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.EM_TRANSCODE_IMAGE_QUALITY; import com.netsdk.lib.NetSDKLib.EM_TRANSCODE_VIDEO_COMPRESSION; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.LOG_SET_PRINT_INFO; import com.netsdk.lib.NetSDKLib.NET_EM_AUDIO_FORMAT; import com.netsdk.lib.NetSDKLib.NET_EM_BITRATE_CONTROL; import com.netsdk.lib.NetSDKLib.NET_IN_DEL_VIRTUALCHANNEL_OF_TRANSCODE; import com.netsdk.lib.NetSDKLib.NET_IN_GET_VIRTUALCHANNEL_OF_TRANSCODE; import com.netsdk.lib.NetSDKLib.NET_IN_TRANDCODE_GET_CAPS; import com.netsdk.lib.NetSDKLib.NET_OUT_DEL_VIRTUALCHANNEL_OF_TRANSCODE; import com.netsdk.lib.NetSDKLib.NET_OUT_GET_VIRTUALCHANNEL_OF_TRANSCODE; import com.netsdk.lib.NetSDKLib.NET_OUT_TRANSCODE_GET_CAPS; import com.netsdk.lib.NetSDKLib.NET_TRANSCODE_AUDIO_FORMAT; import com.netsdk.lib.NetSDKLib.NET_TRANSCODE_VIDEO_FORMAT; import com.netsdk.lib.NetSDKLib.NET_VIDEO_SOURCE_INFO; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class VirtualChannelUnit { //实体化 SDK 调用对象 static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; //Begin:设备登入信息------------ private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); private static int VirtualChannel = 0; String address = "172.12.9.110"; // IP int port = 37777; // 端口 String username = "admin"; // 登入用户名 String password = "admin123"; // 登入密码 //Finish:设备登入信息------------ //Begin:回调事件设置------------ //断线回调 private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() {} public static DisconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device Disconnect [%s:%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } //断线重练回调 private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect { private static HaveReconnectCallback instance = new HaveReconnectCallback(); private HaveReconnectCallback() {} public static HaveReconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s:%d] HaveReconnected!\n" , pchDVRIP , nDVRPort); } } //Finish:回调事件设置------------ //开启设备 public void BeginTest() { // SDK资源初始化 netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null); // 设置断线重连回调,当设备断线后会自动重连并在重连后自动调用HaveReConnect(可选) netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); // 向设备登入 int nSpecCap = 0; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError); if(loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); FinishTest(); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); // 打开SDK日志(可选) LOG_SET_PRINT_INFO setLog = new 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 (!netsdkApi.CLIENT_LogOpen(setLog)) { System.err.println("Failed to open NetSDK log !!!"); } netsdkApi.CLIENT_SetSnapRevCallBack(SnapCallback.getInstance(), null); } //关闭设备 public void FinishTest() { // 停止订阅报警 if (netsdkApi.CLIENT_StopListen(loginHandle)) { System.out.println("取消订阅报警信息."); } System.out.println("Finish Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } // 获取虚拟通道测试 public void Test_GetVirtualChannel() { //方法参数定义 NET_IN_GET_VIRTUALCHANNEL_OF_TRANSCODE pInParam = new NET_IN_GET_VIRTUALCHANNEL_OF_TRANSCODE(); NET_OUT_GET_VIRTUALCHANNEL_OF_TRANSCODE pOutParam = new NET_OUT_GET_VIRTUALCHANNEL_OF_TRANSCODE(); //入参初始化 { //netVideoSourceInfo初始化 NET_VIDEO_SOURCE_INFO netVideoSourceInfo = new NET_VIDEO_SOURCE_INFO(); netVideoSourceInfo.emProtocolType = NetSDKLib.EM_DEV_PROTOCOL_TYPE.EM_DEV_PROTOCOL_GENERAL; //general /*byte[] szIp="172.23.12.27".getBytes(); System.arraycopy(szIp, 0, netVideoSourceInfo.szIp, 0, szIp.length); netVideoSourceInfo.nPort=554; byte[] username="admin".getBytes(); //用户名 System.arraycopy(username, 0, netVideoSourceInfo.szUser, 0, username.length); byte[] szPwd="admin11111".getBytes(); //密码 System.arraycopy(szPwd, 0, netVideoSourceInfo.szPwd, 0, szPwd.length); netVideoSourceInfo.nChannelID=1;*/ //byte[] url="rtsp://admin:admin11111@172.23.12.27:554/cam/realmonitor?channel=1&subtype=0".getBytes(); byte[] url="rtsp://10.80.50.221:8319/dss/monitor/param?cameraid=Y1ZjU88nA1BOO1FFANNLFT&substream=1&trackID=0&urlType=2".getBytes(); System.arraycopy(url, 0, netVideoSourceInfo.szStreamUrl, 0, url.length); // 视频源url地址, emProtocolType为EM_DEV_PROTOCOL_GENERAL 时有效 //netTranscodeVideoFormat初始化 NET_TRANSCODE_VIDEO_FORMAT netTranscodeVideoFormat = new NET_TRANSCODE_VIDEO_FORMAT(); netTranscodeVideoFormat.emCompression=EM_TRANSCODE_VIDEO_COMPRESSION.EM_TRANSCODE_VIDEO_H264; //视频压缩格式 netTranscodeVideoFormat.nWidth=720; netTranscodeVideoFormat.nHeight=576; netTranscodeVideoFormat.emBitRateControl=NET_EM_BITRATE_CONTROL.EM_BITRATE_CBR; //码流控制模式 netTranscodeVideoFormat.nBitRate=384; netTranscodeVideoFormat.fFrameRate=25; //fps http://172.23.12.14/ netTranscodeVideoFormat.nIFrameInterval=50; //I帧间隔 netTranscodeVideoFormat.emImageQuality=EM_TRANSCODE_IMAGE_QUALITY.EM_TRANSCODE_IMAGE_QUALITY_Q60; //netTranscodeAudioFormat初始化 NET_TRANSCODE_AUDIO_FORMAT netTranscodeAudioFormat = new NET_TRANSCODE_AUDIO_FORMAT(); netTranscodeAudioFormat.emCompression = NET_EM_AUDIO_FORMAT.EM_AUDIO_FORMAT_PCM; //音频压缩格式 netTranscodeAudioFormat.nFrequency = 44000; //音频采样频率 pInParam.stuVideoSourceInfo = netVideoSourceInfo; pInParam.stuTransVideoFormat = netTranscodeVideoFormat; pInParam.stuTransAudioFormat = netTranscodeAudioFormat; pInParam.stuVirtualChnPolicy.bDeleteByCaller=1; pInParam.stuVirtualChnPolicy.bContinuous=1; //pInParam.write(); } //方法调用 boolean bRet = netsdkApi.CLIENT_GetVirtualChannelOfTransCode(loginHandle,pInParam,pOutParam,3000); if(bRet){ VirtualChannel=pOutParam.nVirtualChannel; System.out.println("获取转码虚拟通道号成功"+pOutParam.nVirtualChannel); } else{ System.err.printf("获取转码虚拟通道号失败 Last Error[%x]\n",netsdkApi.CLIENT_GetLastError()); } } // 获取转码能力测试 public void Test_GetTransCodeCaps() { //方法参数定义 NET_IN_TRANDCODE_GET_CAPS pInParam = new NET_IN_TRANDCODE_GET_CAPS(); NET_OUT_TRANSCODE_GET_CAPS pOutParam = new NET_OUT_TRANSCODE_GET_CAPS(); //方法调用 boolean getCapsOfTransCode = netsdkApi.CLIENT_GetCapsOfTransCode(loginHandle,pInParam,pOutParam,3000); if(getCapsOfTransCode){ //输出参数解析 System.out.println("最小虚拟通道号:"+pOutParam.nMinVirtualChannel); System.out.println("最大虚拟通道号:"+pOutParam.nMaxVirtualChannel); System.out.println("是否支持压缩错误码实时上报:"+pOutParam.bSupportErrorCode); System.out.println("是否支持持续转码:"+pOutParam.bSupportContinuous); System.out.println("是否支持由用户管理虚拟通道:"+pOutParam.bSupportDelByCaller); } else{ System.out.println("获取转码能力集失败"); } return; } // 删除虚拟通道测试 public void Test_DeleteVirtualChannel() { NET_IN_DEL_VIRTUALCHANNEL_OF_TRANSCODE pInParam = new NET_IN_DEL_VIRTUALCHANNEL_OF_TRANSCODE(); NET_OUT_DEL_VIRTUALCHANNEL_OF_TRANSCODE pOutParam = new NET_OUT_DEL_VIRTUALCHANNEL_OF_TRANSCODE(); pInParam.nVirtualChannel = VirtualChannel; boolean bRet = netsdkApi.CLIENT_DelVirtualChannelOfTransCode(loginHandle, pInParam, pOutParam, 5000); if (!bRet) { System.err.printf("CLIENT_DelVirtualChannelOfTransCode Error[0x%x]\n", netsdkApi.CLIENT_GetLastError()); return; } if (-1 == pInParam.nVirtualChannel) { System.out.println("已删除全部虚拟通道号"); } else { System.out.println("已删除虚拟通道号:"+pInParam.nVirtualChannel); } return; } public static void main(String[] args) { VirtualChannelUnit demo = new VirtualChannelUnit(); demo.BeginTest(); demo.Test_GetVirtualChannel(); demo.Test_GetTransCodeCaps(); demo.Test_DeleteVirtualChannel(); demo.FinishTest(); } }