| | |
| | | package com.ruoyi.device.dhsdk.module; |
| | | |
| | | import com.ruoyi.device.dhsdk.lib.NetSDKLib; |
| | | import com.ruoyi.device.dhsdk.lib.ToolKits; |
| | | import com.sun.jna.Pointer; |
| | | |
| | | import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk; |
| | | |
| | | /** |
| | | * 实时预览接口实现 |
| | | * 主要有 :开始拉流、停止拉流功能 |
| | | */ |
| | | public class RealPlayModule { |
| | | /** |
| | | * \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) { |
| | | System.err.println("开始实时预览失败,错误码" + ToolKits.getErrorCodePrint()); |
| | | } else { |
| | | System.out.println("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: |
| | | System.out.println("码流大小为" + dwBufSize + "\n" + "码流类型为原始音视频混合数据"); |
| | | break; |
| | | case 1: |
| | | //标准视频数据 |
| | | System.out.println("码流大小为" + dwBufSize + "\n" + "码流类型为标准视频数据"); |
| | | break; |
| | | case 2: |
| | | //yuv 数据 |
| | | System.out.println("码流大小为" + dwBufSize + "\n" + "码流类型为yuv数据"); |
| | | break; |
| | | case 3: |
| | | //pcm 音频数据 |
| | | System.out.println("码流大小为" + dwBufSize + "\n" + "码流类型为音频数据"); |
| | | break; |
| | | case 4: |
| | | //原始音频数据 |
| | | System.out.println("码流大小为" + dwBufSize + "\n" + "码流类型为原始音频数据"); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | package com.ruoyi.device.dhsdk.module;
|
| | |
|
| | | import com.ruoyi.device.dhsdk.lib.NetSDKLib;
|
| | | import com.ruoyi.device.dhsdk.lib.ToolKits;
|
| | | import com.sun.jna.Pointer;
|
| | | import lombok.extern.slf4j.Slf4j;
|
| | |
|
| | | import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
|
| | |
|
| | | /**
|
| | | * 实时预览接口实现
|
| | | * 主要有 :开始拉流、停止拉流功能
|
| | | */
|
| | | @Slf4j(topic = "dhSdk")
|
| | | public class RealPlayModule {
|
| | | /**
|
| | | * \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;
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | } |