package com.netsdk.demo.customize; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.*; import com.sun.jna.Native; import com.sun.jna.Pointer; import javax.swing.*; import java.awt.*; import java.util.Vector; public class CommonWithCallBack { // 带回调方法 static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; LLong loginHandle; JWindow wnd; private static final int MAX_WINDOW_NUM = 4; Vector vecWnd; public CommonWithCallBack(LLong loginHandle) { this.loginHandle = loginHandle; createWindow(); } /** * 裸流回调,此功能所用库,需要开宏 */ public void RealPlay() { createVecWindow(); int nChannelID = 0; // 通道号 int rType = NET_RealPlayType.NET_RType_Realplay; // 预览类型 int i = 0; Vector vecRealHandle = new Vector(); for (JWindow w : vecWnd) { w.setVisible(true); if (i%2 == 0) { nChannelID = 0; }else { nChannelID = 1; } LLong nlRealPlay = netsdkApi.CLIENT_RealPlayEx(loginHandle, nChannelID, Native.getComponentPointer(w), rType); // Native.getComponentPointer(wnd) if (nlRealPlay.longValue() == 0) { System.err.println((++i) + " RealPlay Failed!"); } else { netsdkApi.CLIENT_SetRealDataCallBackEx(nlRealPlay, RealDataCallBack.getInstance(), null, 0); vecRealHandle.add(nlRealPlay); System.out.println((++i) + " RealPlay Succeed!"); } } try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 停止预览 for (LLong lRealHandle : vecRealHandle) { netsdkApi.CLIENT_StopRealPlay(lRealHandle); } for (JWindow w : vecWnd) { w.setVisible(false); } vecRealHandle.clear(); vecWnd.clear(); } /** * 裸流回调,此功能所用库,需要开宏 */ public void RealPlayByDataType() { wnd.setVisible(true); NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE(); stIn.hWnd = Native.getComponentPointer(wnd); stIn.emDataType = EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM; stIn.nChannelID = 0; stIn.rType = NET_RealPlayType.NET_RType_Realplay; stIn.cbRealData = RealDataCallBack.getInstance(); stIn.dwUser = null; stIn.szSaveFileName = "d:/123.flv"; // 转换后的裸H264码流文件名 NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE(); LLong lRealHandle = netsdkApi.CLIENT_RealPlayByDataType(loginHandle, stIn, stOut, 5000); if(lRealHandle.longValue() != 0) { System.out.println("RealPlayByDataType Succeed!"); } else { System.err.printf("RealPlayByDataType Failed!Last Error[0x%x]\n", netsdkApi.CLIENT_GetLastError()); return; } try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 停止预览 netsdkApi.CLIENT_StopRealPlay(lRealHandle); // 必须停止拉流后,才会生成123.dat wnd.setVisible(false); } // 回调建议写成单例模式, 回调里处理数据,需要另开线程 public static class RealDataCallBack implements NetSDKLib.fRealDataCallBackEx { private RealDataCallBack() {} private static class RealDataCallBackHolder { private static final RealDataCallBack realDataCB = new RealDataCallBack(); } public static final RealDataCallBack getInstance() { return RealDataCallBackHolder.realDataCB; } @Override public void invoke(LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) { System.out.println("RealDataCallBack dwDataType : " + dwDataType); if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM)) { System.out.println("RealDataCallBack dwDataType : " + dwDataType); } } } public void PlayBackByDataType() { wnd.setVisible(true); NetSDKLib.NET_IN_PLAYBACK_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_PLAYBACK_BY_DATA_TYPE(); stIn.emDataType = EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS; // 私有码流 stIn.nChannelID = 0; stIn.hWnd = Native.getComponentPointer(wnd); // 播放窗格 stIn.stStartTime.setTime(2018, 5, 22, 13, 0, 0); // 开始时间 stIn.stStopTime.setTime(2018, 5, 22, 14, 0, 0); // 结束时间 stIn.nPlayDirection = 0; // 正放 stIn.cbDownLoadPos = PlayBackPosCallBack.getInstance(); stIn.dwPosUser = null; stIn.fDownLoadDataCallBack = PlayBackDataCallBack.getInstance(); stIn.dwDataUser = null; NetSDKLib.NET_OUT_PLAYBACK_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_PLAYBACK_BY_DATA_TYPE(); LLong lPlayHandle = netsdkApi.CLIENT_PlayBackByDataType(loginHandle, stIn, stOut, 5000); if(lPlayHandle.longValue() != 0) { System.out.println("PlayBackByDataType Succeed!"); } else { System.err.printf("PlayBackByDataType Failed!Last Error[0x%x]\n", netsdkApi.CLIENT_GetLastError()); return; } try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } netsdkApi.CLIENT_StopPlayBack(lPlayHandle); // 停止回放 wnd.setVisible(false); } public void PlayBackByTime() { wnd.setVisible(true); NET_IN_PLAY_BACK_BY_TIME_INFO stuIn = new NET_IN_PLAY_BACK_BY_TIME_INFO(); stuIn.stStartTime.setTime(2019, 1, 10, 11, 0, 0); // 开始时间 stuIn.stStopTime.setTime(2019, 1, 10, 13, 0, 0); // 结束时间 stuIn.hWnd = Native.getComponentPointer(wnd); // 播放窗格 stuIn.cbDownLoadPos = PlayBackPosCallBack.getInstance(); stuIn.dwPosUser = null; stuIn.fDownLoadDataCallBack = PlayBackDataCallBack.getInstance(); stuIn.dwDataUser = null; stuIn.nPlayDirection = 0; // 正放 NET_OUT_PLAY_BACK_BY_TIME_INFO stuOut = new NET_OUT_PLAY_BACK_BY_TIME_INFO(); // LLong lPlayHandle = netsdkApi.CLIENT_PlayBackByTimeEx2(loginHandle, 2, stuIn, stuOut); LLong lPlayHandle = netsdkApi.CLIENT_PlayBackByTime(loginHandle, 2, stuIn.stStartTime, stuIn.stStopTime, Native.getComponentPointer(wnd), PlayBackPosCallBack.getInstance(), null); if(lPlayHandle.longValue() != 0) { System.out.println("PlayBackByTime Succeed!"); } else { System.err.printf("PlayBackByTime Failed!Last Error[0x%x]\n", netsdkApi.CLIENT_GetLastError()); return; } try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } netsdkApi.CLIENT_StopPlayBack(lPlayHandle); // 停止回放 wnd.setVisible(false); } // 回调建议写成单例模式, 回调里处理数据,需要另开线程 // 回放进度回调 public static class PlayBackPosCallBack implements NetSDKLib.fDownLoadPosCallBack { private PlayBackPosCallBack() {} private static class PlayBackPosCallBackHolder { private static final PlayBackPosCallBack posCB = new PlayBackPosCallBack(); } public static final PlayBackPosCallBack getInstance() { return PlayBackPosCallBackHolder.posCB; } @Override public void invoke(LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, Pointer dwUser) { System.out.println("PlayBackPosCallBack dwTotalSize: " + dwTotalSize + " dwDownLoadSize: " + dwDownLoadSize); } } // 回放数据回调 public static class PlayBackDataCallBack implements NetSDKLib.fDataCallBack { private PlayBackDataCallBack() {} private static class PlayBackDataCallBackHolder { private static final PlayBackDataCallBack dataCB = new PlayBackDataCallBack(); } public static final PlayBackDataCallBack getInstance() { return PlayBackDataCallBackHolder.dataCB; } @Override public int invoke(LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer dwUser) { if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS)) { System.out.println("PlayBack DataCallBack [ " + dwDataType +" ]"); } return 0; } } public void DownloadByDataType() { NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE(); stIn.emDataType = EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM; // 私有码流 stIn.emRecordType = EM_QUERY_RECORD_TYPE.EM_RECORD_TYPE_ALL; // 所有录像 stIn.nChannelID = 0; stIn.stStartTime.setTime(2018, 12, 30, 12, 55, 0); // 开始时间 stIn.stStopTime.setTime(2018, 11, 30, 13, 0, 0); // 结束时间 stIn.cbDownLoadPos = DownloadPosCallBack.getInstance(); stIn.dwPosUser = null; stIn.fDownLoadDataCallBack = DownLoadDataCallBack.getInstance(); stIn.dwDataUser = null; stIn.szSavedFileName = "d:/456.dat"; NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE(); stIn.write(); stOut.write(); LLong lPlayHandle = netsdkApi.CLIENT_DownloadByDataType(loginHandle, stIn.getPointer(), stOut.getPointer(), 5000); if(lPlayHandle.longValue() != 0) { System.out.println("DownloadByDataType Succeed!"); } else { System.err.printf("DownloadByDataType Failed!Last Error[0x%x]\n", netsdkApi.CLIENT_GetLastError()); return; } try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } netsdkApi.CLIENT_StopDownload(lPlayHandle); // 停止下载 } // 回调建议写成单例模式, 回调里处理数据,需要另开线程 // 下载进度回调 public static class DownloadPosCallBack implements NetSDKLib.fTimeDownLoadPosCallBack { private DownloadPosCallBack() {} private static class DownloadPosCallBackHolder { private static final DownloadPosCallBack posCB = new DownloadPosCallBack(); } public static final DownloadPosCallBack getInstance() { return DownloadPosCallBackHolder.posCB; } @Override public void invoke(LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) { // System.out.println("DownloadPosCallBack dwTotalSize: " + dwTotalSize + " dwDownLoadSize: " + dwDownLoadSize); } } // 下载数据回调 public static class DownLoadDataCallBack implements NetSDKLib.fDataCallBack { private DownLoadDataCallBack() {} private static class DownloadDataCallBackHolder { private static final DownLoadDataCallBack dataCB = new DownLoadDataCallBack(); } public static final DownLoadDataCallBack getInstance() { return DownloadDataCallBackHolder.dataCB; } @Override public int invoke(LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer dwUser) { if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS)) { System.out.println("DownLoad DataCallBack [ " + dwDataType +" ]"); } return 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); } public void createVecWindow() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int nSplit = (int)Math.sqrt(MAX_WINDOW_NUM); int height = screenSize.height/nSplit; int width = screenSize.width/nSplit; System.out.println("screenSize.height: " + screenSize.height + " screenSize.width: " + screenSize.width + " nSplit: " + nSplit + " height: " + height + " width: " + width); vecWnd = new Vector(); for (int i = 0; i < MAX_WINDOW_NUM; ++i) { JWindow w = new JWindow(); w.setSize(screenSize); int x = (width*i)% screenSize.width; int y = height*(width*i/screenSize.width); System.out.println("x: " + x + " y: " + y); w.setLocation(x, y); vecWnd.add(w); } } }