package com.ruoyi.utils.sdk.dhsdk.module; import com.ruoyi.utils.sdk.dhsdk.lib.NetSDKLib; import com.ruoyi.utils.sdk.dhsdk.lib.ToolKits; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; import static com.ruoyi.utils.sdk.dhsdk.module.LoginModule.netsdk; /** * 实时预览接口实现 * 主要有 :开始拉流、停止拉流功能 */ @Slf4j(topic = "dhSdk") public class RealPlayModule { public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE; public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE; /** * \if ENGLISH_LANG * Start RealPlay * \else * 开始预览 * \endif */ public static NetSDKLib.LLong startRealPlay(NetSDKLib.LLong m_hLoginHandle, int channel, String path) { NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE net_in_realplay_by_data_type = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE(); net_in_realplay_by_data_type.nChannelID = channel; net_in_realplay_by_data_type.hWnd = null; net_in_realplay_by_data_type.rType = 0; net_in_realplay_by_data_type.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_MP4; net_in_realplay_by_data_type.szSaveFileName = path; NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE net_out_realplay_by_data_type = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE(); NetSDKLib.LLong m_hPlayHandle = netsdk.CLIENT_RealPlayByDataType(m_hLoginHandle, net_in_realplay_by_data_type, net_out_realplay_by_data_type, 5000); if (m_hPlayHandle.longValue() == 0) { log.error("开始实时预览失败,错误码" + ToolKits.getErrorCodePrint()); } else { log.debug("Success to start realplay"); } return m_hPlayHandle; } /** * \if ENGLISH_LANG * Stop RealPlay * \else * 停止预览 * \endif */ public static void stopRealPlay(NetSDKLib.LLong m_hPlayHandle) { if (m_hPlayHandle.longValue() == 0) { return; } boolean bRet = netsdk.CLIENT_StopRealPlayEx(m_hPlayHandle); if (bRet) { m_hPlayHandle.setValue(0); } } /** * 实时预览数据回调函数--扩展(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(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, int param, Pointer dwUser) { int bInput = 0; if (0 != lRealHandle.longValue()) { switch (dwDataType) { case 0: log.debug("码流大小为" + dwBufSize + "\n" + "码流类型为原始音视频混合数据"); break; case 1: //标准视频数据 log.debug("码流大小为" + dwBufSize + "\n" + "码流类型为标准视频数据"); break; case 2: //yuv 数据 log.debug("码流大小为" + dwBufSize + "\n" + "码流类型为yuv数据"); break; case 3: //pcm 音频数据 log.debug("码流大小为" + dwBufSize + "\n" + "码流类型为音频数据"); break; case 4: //原始音频数据 log.debug("码流大小为" + dwBufSize + "\n" + "码流类型为原始音频数据"); break; default: break; } } } } }