liusuyi
2023-10-23 3591fc47eaa3e301252dc06d257d46bd3a45e120
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/RealPlayModule.java
@@ -1,102 +1,104 @@
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;
                }
            }
        }
    }
}