package com.netsdk.demo.units; import java.io.File; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.LOG_SET_PRINT_INFO; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class AudioUnit { //实体化 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); String address = "10.35.83.104"; // IP int port = 37777; // 端口 String username = "admin"; // 登入用户名 String password = "123456"; // 登入密码 //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内部要编码的源音频数据的音频格式,对不支持的音频格式初始化会失败 NetSDKLib.NET_AUDIO_FORMAT aFormat =new NetSDKLib.NET_AUDIO_FORMAT(); aFormat.byFormatTag = 0; // 编码类型,如0:PCM 注意只支持PCM 格式的音频文件 aFormat.nChannels = 1; // 声道数 aFormat.wBitsPerSample = 16; // 采样深度 aFormat.nSamplesPerSec = 8000; // 采样率 if(netsdkApi.CLIENT_InitAudioEncode(aFormat) == 0) { System.out.println("InitAudioEncode Succeed!"); } else { System.err.println("InitAudioEncode Failed!"); } // 打开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"; System.err.println("log=>" +logPath); 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 !!!"); } } public void ARun() { Memory lpInBuf = new Memory(ToolKits.GetFileSize("D:/test.pcm")); if(ToolKits.ReadAllFileToMemory("D:/test.pcm", lpInBuf)) { System.out.printf("读取文件成功!!\n"); } else { System.err.printf("读取文件失败!!\n"); } IntByReference lpInLen=new IntByReference(9000); Pointer lpOutBuf = new Memory(9000); IntByReference lpOutLen = new IntByReference(9000); //进行音频的数据二次编码,从标准音频格式转换成设备支持的格式 int a = netsdkApi.CLIENT_AudioEncode(loginHandle, lpInBuf,lpInLen, lpOutBuf, lpOutLen); if(a == 0) { System.out.println("CLIENT_AudioEncode ==> True"); if(0 == netsdkApi.CLIENT_ReleaseAudioEncode()) { System.out.println("CLIENT_ReleaseAudioEncode ==> True"); }else { System.out.println("CLIENT_ReleaseAudioEncode ==> False"); } }else { System.err.println("CLIENT_AudioEncode ==> False"); netsdkApi.CLIENT_ReleaseAudioEncode(); } } //关闭设备 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 static void main(String[]args) { AudioUnit demo = new AudioUnit(); demo.BeginTest(); demo.ARun(); demo.FinishTest(); } }