From 5796507313695fe35a5e734aeeaff68ae23fa257 Mon Sep 17 00:00:00 2001 From: 4670101279 Date: Mon, 27 Jun 2022 10:51:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=91=84=E5=83=8F=E6=9C=BA=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdk/java/lib/playmanager/PlayDefs.java | 29 + .../java/lib/playmanager/PlayDelegates.java | 88 +++ .../sdk/java/lib/playmanager/PlayEnums.java | 139 ++++ .../sdk/java/lib/playmanager/PlayLib.java | 632 ++++++++++++++++++ .../sdk/java/lib/playmanager/PlayStructs.java | 303 +++++++++ 5 files changed, 1191 insertions(+) create mode 100644 ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDefs.java create mode 100644 ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDelegates.java create mode 100644 ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayEnums.java create mode 100644 ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayLib.java create mode 100644 ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayStructs.java diff --git a/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDefs.java b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDefs.java new file mode 100644 index 0000000..c9144b1 --- /dev/null +++ b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDefs.java @@ -0,0 +1,29 @@ +package sdk.java.lib.playmanager; + +public class PlayDefs { + + public static final int PLAY_LOG_ATTRIBUTE_ENABLE = 0x01; + public static final int PLAY_LOG_ATTRIBUTE_PRINT = 0x02; + public static final int PLAY_LOG_ATTRIBUTE_WRITE = 0x04; + + // 按帧序号获取关键帧 + public static final int TYPE_BY_FRAME_NUMBER = 1; + // 按帧事件获取关键帧 + public static final int TYPE_BY_FRAME_TIME = 2; + + public static final int MAX_SOURCE_BUF_SIZE = 1024 * 1024 * 100; // 数据流缓冲区最大长度 + public static final int MIN_SOURCE_BUF_SIZE = 1024 * 50; // 数据流缓冲区最小长度 + + public static final int STREAM_TYPE_REALTIME = 0; // 实时流模式 + public static final int STREAM_TYPE_FILE = 1; // 文件流模式 + + public static final int PlayMS_QueryTime = 1; //编码中时间信息 + public static final int PlayMS_QueryFileRate = 2; //帧率信息 + public static final int PlayMS_QueryMediaInfo = 3; //媒体信息 + public static final int PlayMS_QueryRenderNum = 4; //当前要渲染的帧号 + public static final int PlayMS_QueryRenderTime = 5; //当前要渲染的时间 + public static final int PlayMS_QuerySrcTime = 6; //视频源中的时间信息 + public static final int PlayMS_QueryCurRenderNum = 7; //当前帧号。4是上一帧的帧号 + public static final int PlayMS_QueryRenderPTS = 8; //当前要渲染的帧时间戳 + +} diff --git a/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDelegates.java b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDelegates.java new file mode 100644 index 0000000..0340abd --- /dev/null +++ b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayDelegates.java @@ -0,0 +1,88 @@ +package sdk.java.lib.playmanager; + +import com.sun.jna.Callback; +import com.sun.jna.Pointer; + +public class PlayDelegates +{ + /********************************************************************************** + 参数: [in] + HDC hDc 绘图设备上下文句柄 + void* pUserData 用户参数 + **********************************************************************************/ + public interface fRegDrawCallBack extends Callback + { + public void invoke(int nPort, Pointer hDc, Pointer pUserData); + } + + /********************************************************************************** + 参数: [in] + pBuf 数据指针 + nType 数据类型 + nLen 数据大小 + nRealLen 数据真实大小 + pReserved 保留参数 + pUserData 用户自定义数据 + **********************************************************************************/ + public interface fGetIVSInfoCallBack extends Callback + { + public void invoke(Pointer pBuf, int nType, int nLen, int nRealLen, Pointer pReserved, Pointer pUserData); + } + + /********************************************************************************** + 参数: [in] + FRAME_DEC_INFO* pFrameDecodeInfo: 帧内容 + FRAME_ATTRI_INFO_EX* pFrameInfo: 帧信息 + void* pUserData: 用户参数 + **********************************************************************************/ + public interface fDecodeCallBack extends Callback + { + public void invoke(int nPort, Pointer pFrameDecodeInfo, Pointer pFrameInfo, Pointer pUserData); + } + + /********************************************************************************** + 参数: [in] + char* pYuvBuf: 视频帧 YUV 数据 + void* pReserved: 保留参数 + **********************************************************************************/ + public interface fDisplayCallBack extends Callback + { + public void invoke(int nPort, Pointer pYuvBuf, int nYuvSize, int nWidth, int nHeight, int nStamp, int nType, Pointer pReserved); + } + + /********************************************************************************** + 参数: [in] + char* pAudioBuf: 视频帧 YUV 数据 + void* pUserData: 用户参数 + **********************************************************************************/ + public interface fAudioCallBack extends Callback + { + public void invoke(int nPort, Pointer pAudioBuf, int nSize, int nStamp, int nType, Pointer pUserData); + } + + + public interface fFileEndCallBack extends Callback + { + public void invoke(int nPort, Pointer pUserData); + } + + /********************************************************************************** + 参数: [in] + char* pBuf: 水印数据buffer指针 + void* pUserData: 用户参数 + **********************************************************************************/ + public interface fGetWaterMarkInfoCallBack extends Callback + { + public void invoke(Pointer pBuf, int nKey, int nLen, int nRealLen, int nType, Pointer pUserData); + } + + /********************************************************************************** + 参数: [in] + char* buf: 水印数据缓冲 + void* pUserData: 用户参数 + **********************************************************************************/ + public interface fGetWaterMarkInfoCallBackEx extends Callback + { + public void invoke(int nPort, Pointer buf, int lTimeStamp, int lInfoType, int len, int reallen, int lCheckResult, Pointer pUserData); + } +} diff --git a/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayEnums.java b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayEnums.java new file mode 100644 index 0000000..50d1c44 --- /dev/null +++ b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayEnums.java @@ -0,0 +1,139 @@ +package sdk.java.lib.playmanager; + +import com.sun.jna.Structure; + +public class PlayEnums { + + // 语言种类 + public static class ENUM_RENDER_TYPE extends Structure + { + // 智能数据渲染 + public static final int RENDER_TYPE_INTL = 0x63; + // 动检数据渲染 + public static final int RENDER_TYPE_MOTION = 0x65; + }; + + // YUV 数据类型 + public static class ENUM_YUV_TYPE extends Structure + { + // UYVY类型的YUV数据 + public static final int TYPE_UYUV = 1; + // 4:2:0类型YUV数据 + public static final int TYPE_IYUV = 3; + // RGB32类型YUV数据 + public static final int TYPE_RGB32 = 7; + }; + + // 音频数据类型 + public static class ENUM_AUDIO_DATA_TYPE extends Structure + { + // 8位音频数据类型 + public static final int TYPE_AUDIO_DATA_8 = 100; + // 16位音频数据类型 + public static final int TYPE_AUDIO_DATA_16 = 101; + }; + + // 帧缓冲类型 + public static class ENUM_MEDIA_BUF_TYPE extends Structure + { + // 视频源缓冲 + public static final int TYPE_MEDIA_VIDEO_SRC_BUF = 1; + // 音频源缓冲 + public static final int TYPE_MEDIA_AUDIO_SRC_BUF = 2; + // 解码后视频数据缓冲 + public static final int TYPE_MEDIA_VIDEO_RENDER_BUF = 3; + // 解码后音频数据缓冲 + public static final int TYPE_MEDIA_AUDIO_RENDER_BUF = 4; + }; + + // 多媒体帧类型 + public static class ENUM_MEDIA_FRAME_TYPE extends Structure + { + public static final int MEDIA_FRAME_TYPE_VIDEO = 1; // 视频帧类型 + public static final int MEDIA_FRAME_TYPE_AUDIO = 2; // 音频帧类型 + public static final int MEDIA_FARMA_TYPE_DATA = 3; // 数据帧类型 + }; + + // 帧子类型 + public static class ENUM_SUB_FRAME_TYPE extends Structure + { + public static final int SUB_FRAME_TYPE_VIDEO_I = 0; // I帧 + public static final int SUB_FRAME_TYPE_VIDEO_P = 1; // P帧 + public static final int SUB_FRAME_TYPE_VIDEO_B = 2; // B帧 + public static final int SUB_FRAME_TYPE_VIDEO_S = 3; // S帧 + + public static final int SUB_FRAME_TYPE_VIDEO_MJPEG = 8; // MJPEG + }; + + // 编码格式 + public static class ENUM_VIDEO_ENCODE_TYPE extends Structure + { + public static final int VIDEO_ENCODE_TYPE_UNKNOWN = 0x00; // 未知视频编码格式 + public static final int VIDEO_ENCODE_TYPE_MPEG4 = 0x01; // MPEG4 视频编码格式 + public static final int VIDEO_ENCODE_TYPE_HISI_H264 = 0x02; // 海思H264视频编码格式 + public static final int VIDEO_ENCODE_TYPE_JPEG = 0x03; // 标准JPEG视频编码格式 + + public static final int VIDEO_ENCODE_TYPE_AVS = 0x07; // 标准AVS视频编码格式 + public static final int VIDEO_ENCODE_TYPE_STD_H264 = 0x08; // 标准H264视频编码格式 + public static final int VIDEO_ENCODE_TYPE_MPEG2 = 0x09; // MPEG2视频编码格式 + + public static final int VIDEO_ENCODE_TYPE_RY_H264 = 0x0D; // 我司H264视频编码格式 + public static final int VIDEO_ENCODE_TYPE_RY_H265 = 0x0E; // 我司H265视频编码格式 + }; + + public static class ENUM_STREAM_PACKAGE_TYPE extends Structure + { + public static final int STREAM_PACKAGE_TYPE_UNKNOWN = 0x00; // 未知码流 + public static final int STREAM_PACKAGE_TYPE_MPEG4 = 0x01; // MPEG4 + + public static final int STREAM_PACKAGE_TYPE_AUDIO = 0x06; // 音频 + public static final int STREAM_PACKAGE_TYPE_PS = 0x07; // PS(MPEG-2) + + public static final int STREAM_PACKAGE_TYPE_ASF = 0x09; // ASF + + public static final int STREAM_PACKAGE_TYPE_TS = 0x0C; // TS(MPEG-2) + public static final int STREAM_PACKAGE_TYPE_SVC = 0x0D; // SVC + public static final int STREAM_PACKAGE_TYPE_AVI = 0x0E; // AVI + public static final int STREAM_PACKAGE_TYPE_MP4 = 0x0F; // MP4 + public static final int STREAM_PACKAGE_TYPE_CGI = 0x10; // CGI + public static final int STREAM_PACKAGE_TYPE_WAV = 0x11; // WAV音频 + public static final int STREAM_PACKAGE_TYPE_FLV = 0x12; // FLV + + public static final int STREAM_PACKAGE_TYPE_RYMS = 0x13; // 我司码流 + + public static final int STREAM_PACKAGE_TYPE_MKV = 0x14; // MKV + public static final int STREAM_PACKAGE_TYPE_RTP = 0x15; // RTP + public static final int STREAM_PACKAGE_TYPE_RAW_MPEG4 = 0x16; // MPEG4裸码流 + public static final int STREAM_PACKAGE_TYPE_RAW_H264 = 0x17; // H264裸码流 + public static final int STREAM_PACKAGE_TYPE_RAW_H265 = 0x18; // H265裸码流 + public static final int STREAM_PACKAGE_TYPE_WMV = 0x19; // WMV + public static final int STREAM_PACKAGE_TYPE_RAW_MPEG2 = 0x20; // MPEG2裸码流 + public static final int STREAM_PACKAGE_TYPE_RAW_SVAC = 0x21; // SVAC裸码流 + public static final int STREAM_PACKAGE_TYPE_MOV = 0x22; // MOV + public static final int STREAM_PACKAGE_TYPE_VOB = 0x23; // VOB + }; + + // 数据帧的分析方式 + public static class SA_DD_PARSE_TYPE extends Structure + { + public static final int DD_PARSE_TYPE_UNKNOWN = -1; // 未知类型 + + public static final int DD_PARSE_TYPE_INTL = 0x63; // 智能帧物体类型 + + public static final int DD_PARSE_TYPE_MOTION = 0x65; // 动检帧类型 + }; + + // 智能帧物体无类型 + public static class SA_DD_INTL_OBJECT_TYPE extends Structure + { + public static final int DD_INITL_OBJECT_UNKNOWN = -1; // 未知物体 + + public static final int DD_INITL_OBJECT_FACE = 0x30; // 人脸物体 + + public static final int DD_INITL_OBJECT_TRAFFIC = 0x40; // 交通物体 + + public static final int DD_INITL_OBJECT_BODY = 0x50; // 人形物体 + + public static final int DD_INITL_OBJECT_GOODS = 0x51; // 商品 + }; +} diff --git a/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayLib.java b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayLib.java new file mode 100644 index 0000000..a19549d --- /dev/null +++ b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayLib.java @@ -0,0 +1,632 @@ +package sdk.java.lib.playmanager; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.DoubleByReference; +import com.sun.jna.ptr.IntByReference; + +import sdk.java.lib.PlatUtils; +import sdk.java.lib.playmanager.PlayDelegates.fGetIVSInfoCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fAudioCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fDecodeCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fDisplayCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fFileEndCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fGetWaterMarkInfoCallBack; +import sdk.java.lib.playmanager.PlayDelegates.fGetWaterMarkInfoCallBackEx; +import sdk.java.lib.playmanager.PlayDelegates.fRegDrawCallBack; + +public interface PlayLib extends Library +{ + public static String ry_play_library_name = "playmanager"; + PlayLib instance = (PlayLib)Native.loadLibrary(PlatUtils.sdk_plat_getLoadLibrary(ry_play_library_name), PlayLib.class); + + ////////////////////////////////////////////////////////////////////////////////////////////// + /********************************************************************************** + 函数: PlayMS_SetLogOption + 参数: [in] BYTE byOption: 日志选项 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: + **********************************************************************************/ + public boolean PlayMS_SetLogOption(int byOption); + + /********************************************************************************** + 函数: PlayMS_Play + 参数: [in] int nPort: 通道号 + [in] HWND hWnd: 播放窗口句柄 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 开始播放。 如果当前已经是播放状态,则恢复到正常播放速度。 + 在解码线程中,如果窗口句柄为NULL,不显示画面,但不影响解码。 + **********************************************************************************/ + public boolean PlayMS_Play(int nPort, Pointer hWnd); + + /********************************************************************************** + 函数: PlayMS_Stop + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 停止播放。 + **********************************************************************************/ + public boolean PlayMS_Stop(int nPort); + + /********************************************************************************** + 函数: PlayMS_GetCurrentFrameRate + 参数: [in] int nPort: 通道号 + 返回值: 当前帧率 + 说明: 获取当前帧率。 + **********************************************************************************/ + public int PlayMS_GetCurrentFrameRate(int nPort); + + /********************************************************************************** + 函数: PlayMS_SetIVSCallBack + 参数: [in] nPort 解码通道 + [in] pGetIVSInfoCB 设置解码回调 + pBuf 数据指针 + nType 数据类型 + nLen 数据大小 + nRealLen 数据真实大小 + pReserved 保留参数 + pUserData 用户自定义数据 + [in] pUserData 用户自定义数据 + 返回: 成功返回TRUE, 失败返回FALSE + 说明: 设置IVS回调 + **********************************************************************************/ + public boolean PlayMS_SetIVSCallBack(int nPort, fGetIVSInfoCallBack pGetIVSInfoCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_GetCurrentFrameRate + 参数: [in] int nPort: 通道号 + [out] double *pBitRate: 实时码率值 + 返回值: 实时码率 + 说明: 获取实时码率。 + **********************************************************************************/ + public boolean PlayMS_GetRealFrameBitRate(int nPort, DoubleByReference pBitRate); + + /********************************************************************************** + 函数: PlayMS_GetPictureSize + 参数: [in] int nPort: 通道号 + [in] int *pWidth: 图片宽度 + [in] int *pHeight: 图片高度 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 获取码流中原始图像的大小,该函数只有当播放开始后才能获取准确的值。 + **********************************************************************************/ + public boolean PlayMS_GetPictureSize(int nPort, IntByReference pWidth, IntByReference pHeight); + + /********************************************************************************** + 函数: PlayMS_GetStreamOpenMode + 参数: [in] int nPort: 通道号 + 返回值: 成功返回流模式,失败返回-1 + 说明: 获取码流打开模式。 + 0 - STREAM_TYPE_REALTIME(实时流模式) + 1 - STREAM_TYPE_FILE(文件流模式) + **********************************************************************************/ + public int PlayMS_GetStreamOpenMode(int nPort); + + /********************************************************************************** + 函数: PlayMS_SetStreamOpenMode + 参数: [in] int nPort: 通道号 + [in] int nMode: 播放模式 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置码流打开模式,需在PlayMS_Play之前调用 + **********************************************************************************/ + public boolean PlayMS_SetStreamOpenMode(int nPort, int dwMode); + + /********************************************************************************** + 函数: boolean PlayMS_GetFreePort + 参数: [out] int *pnPort 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 获取未使用的通道号,通道号的上限为500。 + 通过该通道号来区分不同路的视频,与PlayMS_ReleasePort匹对使用。 + **********************************************************************************/ + public boolean PlayMS_GetFreePort(IntByReference pnPort); + + /********************************************************************************** + 函数: BOOL PlayMS_ReleasePort + 参数: [in] int nPort 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 释放通道号,与PlayMS_GetFreePort匹对使用。 + **********************************************************************************/ + public boolean PlayMS_ReleasePort(int nPort); + + /********************************************************************************** + 函数: PlayMS_ResetSourceBuffer + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回 FLASE. + 说明: 清空流播放模式下源缓冲数据,一般在关闭码流后调用。 + **********************************************************************************/ + public boolean PlayMS_ResetSourceBuffer(int nPort); + + /********************************************************************************** + 函数: PlayMS_RegisterDrawCallBack + 描述: 注册一个画图函数 + 参数: [in]nPort 端口号 + [in]fRegDrawCB 绘图回调函数 + nPort 端口号 + hDc 绘图设备上下文句柄 + pUserData 用户参数 + [in]pUserData 回调函数的用户参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 注册一个绘图回调函数,用户可以在该绘图回调函数中绘制用户私有数据, + 如用户可以在视频表面绘制一个矩形框。绘图回调函数中不能作过多操作, + 否则会由于该类操作消耗过多时间,从而导致视频实时性受到影响。 + **********************************************************************************/ + public boolean PlayMS_RegisterDrawCallBack(int nPort, fRegDrawCallBack fRegDrawCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_OpenStream + 参数: [in] int nPort: 通道号 + [in] int nBufPoolSize: 设置码流数据的缓冲区大小, + 范围是[SOURCE_BUF_MIN~ SOURCE_BUF_MAX] + 如果码流数据较均匀,可调小该值; + 如果码流数据不均匀,可调大该值。 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 打开码流播放。 + **********************************************************************************/ + public boolean PlayMS_OpenStream(int nPort, int nBufPoolSize); + + /********************************************************************************** + 函数: BOOL PlayMS_CloseStream(int nPort) + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 关闭码流播放。 + **********************************************************************************/ + public boolean PlayMS_CloseStream(int nPort); + + /********************************************************************************** + 函数: PlayMS_InputData + 参数: [in] int nPort: 通道号 + [in] PBYTE pBuf: 缓冲区数据地址 + [in] int nSize: 缓冲区数据大小 + 返回值: 成功返回TRUE, 失败返回FALSE。 + 说明: 输入数据流,需在打开流(PlayMS_OpenStream)且播放(PlayMS_Play)后才能输入数据。 + 如果返回FALSE,很可能是缓冲区溢满,可等待一会儿再输入数据,或者扩大缓冲区。 + **********************************************************************************/ + public boolean PlayMS_InputData(int nPort, Pointer pBuf, int nSize); + + /********************************************************************************** + 函数: PlayMS_SetDecodeCallBack + 参数: [in] int nPort: 通道号 + [in] fDecodeCallBack fDecCB: 解码回调函数指针 + nPort: 通道号 + pFrameDecodeInfo: 帧内容 + pFrameInfo: 帧信息 + pUser: 用户参数 + [in] Pointer pUser: 用户自定义参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置解码数据回调,适用于只解码不显示的情况。 + 需在PlayMS_Play之后调用,在调用PlayMS_Stop之后自动失效 + **********************************************************************************/ + public boolean PlayMS_SetDecodeCallBack(int nPort, fDecodeCallBack fDecCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_SetVisibleDecodeCallBack + 参数: [in] int nPort: 通道号 + [in] fDecodeCallBack fDecCB: 解码回调函数指针 + nPort: 通道号 + pFrameDecodeInfo: 帧内容 + pFrameInfo: 帧信息 + pUser: 用户参数 + [in] Pointer pUserData: 用户自定义参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置解码数据回调,适用于解码且显示的情况。 + 需在PlayMS_Play之后调用,在调用PlayMS_Stop之后自动失效 + **********************************************************************************/ + public boolean PlayMS_SetVisibleDecodeCallBack(int nPort, fDecodeCallBack fDecCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_SetDisplayCallBack + 参数: [in] int nPort: 通道号 + [in] fDisplayCallBack fDisplayCB: 显示回调函数指针 + nPort: 通道号 + pYuvBuf: 视频帧 YUV 数据 + nYuvSize: YUV 数据大小 + nWidth: 画面宽,单位像素 + nHeight: 画面高,单位像素 + nStamp: 时间戳信息 + nType: 视频帧类型, TYPE_IYUV, TYPE_AUDIODATA_16, TYPE_RGB32 + pReserved: 保留参数 + [in] Pointer pUserData: 用户自定义参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置视频抓图回调函数。当用户想得到一段时间内的抓图数据,可调用该函数。 + 当将回调函数设置为NULL时, 停止函数回调。 + 其中设置的回调函数,只有在有解码数据时才被调用,并由用户处理抓图数据。 + 该函数可在任何时候调用 + **********************************************************************************/ + public boolean PlayMS_SetDisplayCallBack(int nPort, fDisplayCallBack fDisplayCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_CatchPic + 参数: [in] int nPort: 通道号 + [in] char* sFileName: 图片的文件名称 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 抓图,当用户想实现一次抓一张图,可调用该函数。 + 该函数在视频暂停、单帧播放时也可使用。 + **********************************************************************************/ + public boolean PlayMS_CatchPic(int nPort, String sFileName); + + /********************************************************************************** + 函数: PlayMS_SetPlayMethod + 参数: [in] int nPort: 通道号 + [in] int nStartTime: 开始播放的时间(ms) + [in] int nSlowTime: 开始慢放的时间(ms) + [in] int nFastTime: 开始快放的时间(ms) + [in] int nFailedTime: 失败时间,超过该时间则数据投递失败(ms) + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置播放的方法策略,该函数只有在实时码流时调用才有效。 + **********************************************************************************/ + public boolean PlayMS_SetPlayMethod(int nPort, int nStartTime, int nSlowTime, int nFastTime, int nFailedTime); + + /********************************************************************************** + 函数: PlayMS_SetDecCBStream + 参数: [in] int nPort: 通道号 + [in] int dwStream: 码流类型,1为视频流,2为音频流,3为复合流 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置解码回调的码流类型,该函数需在PlayMS_Play之前调用 + **********************************************************************************/ + public boolean PlayMS_SetDecCBStream(int nPort, int dwStream); + + /********************************************************************************** + 函数: PlayMS_SetAudioCallBack + 参数: [in] int nPort: 通道号 + [in] fAudioCallBack fAudioCB: 音频回调函数指针 + nPort: 通道号 + pAudioBuf: 音频缓存数据 + nSize: 缓存数据大小 + nStamp: 时标信息,单位毫秒 + nType: 音频数据类型 + 8位音频数据类型 TYPE_AUDIO_DATA_8 = 100, + 16位音频数据类型 TYPE_AUDIO_DATA_16 = 101, + pUserData: 用户参数 + [in] Pointer pUserData: 用户参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置音频解码数据回调 + **********************************************************************************/ + public boolean PlayMS_SetAudioCallBack(int nPort, fAudioCallBack fAudioCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_StartDataRecord + 参数: [in] int nPort: 通道号 + [in] char *sFileName: 录像文件名, + 如果文件名中有不存在的文件夹,就创建该文件夹 + [in] int nDataType: 0表示原始视频流; 1表示转换成AVI格式; + 2表示转换成ASF格式; 3分段保存文件 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 开始流数据录像,该函数需在PlayMS_Play之后调用,只有在实时码流时调用才有效 + **********************************************************************************/ + public boolean PlayMS_StartDataRecord(int nPort, String sFileName, int nDataType); + + /********************************************************************************** + 函数: PlayMS_WriteData + 参数: [in] int nPort: 通道号 + [in] PBYTE pBuf: 码流数据 + [in] int nSize: 码流大小 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 保存原始码流数据 + **********************************************************************************/ + public boolean PlayMS_WriteData(int nPort, byte pBuf, int nSize); + + /********************************************************************************** + 函数: BOOL PlayMS_StopDataRecord(int nPort) + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 停止流数据录像 + **********************************************************************************/ + public boolean PlayMS_StopDataRecord(int nPort); + + /********************************************************************************** + 函数: PlayMS_QueryInfo + [in] int nPort: 通道号 + [in] int nQueryType: 指定查询类型,主要类型如下: + PlayMS_QueryTime 编码中时间信息 + PlayMS_QueryFileRate 帧率信息 + PlayMS_QueryMediaInfo 媒体信息 + PlayMS_QueryRenderNum 当前要渲染的帧号,上一帧的帧号 + PlayMS_QueryRenderTime 当前要渲染的时间 + PlayMS_QuerySrcTime 视频源中的时间信息 + PlayMS_QueryCurRenderNum 当前帧号 + PlayMS_QueryRenderPTS 当前时间戳 + [out] char* pBuffer: 存放查询到的缓冲数据 + [in] int nBufLen: 输入的缓冲区大小 + [out] int* pRetLen: 存放查询的有效数据大小 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 查询指定通道的时间、帧率等信息 + **********************************************************************************/ + public boolean PlayMS_QueryInfo(int nPort, int nQueryType, Pointer pBuffer, int nBufLen, IntByReference pRetLen); + + /********************************************************************************** + 函数: PlayMS_CreateStream + 参数: [in] int nBufPoolSize: 设置码流数据的缓冲区大小 + 范围是[MIN_SOURCE_BUF_SIZE, MAX_SOURCE_BUF_SIZE]. + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 分配空闲通道号并打开码流,就是PlayMS_GetFreePort和PlayMS_OpenStream接口的合集 + **********************************************************************************/ + public int PlayMS_CreateStream(int nBufPoolSize); + + /********************************************************************************** + 函数: PlayMS_DestroyStream + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 关闭码流并释放申请的通道号 + **********************************************************************************/ + public boolean PlayMS_DestroyStream(int nPort); + + /********************************************************************************** + 函数: BOOL PlayMS_OpenFile(int nPort, LPSTR sFileName) + 参数: [in] int nPort: 通道号 + [in] LPSTR sFileName: 文件名 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 打开文件,需在PlayMS_Play之前调用。 + **********************************************************************************/ + public boolean PlayMS_OpenFile(int nPort, String sFileName); + + /********************************************************************************** + 函数: BOOL PlayMS_CloseFile(int nPort) + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 关闭文件,需在PlayMS_Stop之后调用。 + **********************************************************************************/ + public boolean PlayMS_CloseFile(int nPort); + + /********************************************************************************** + 函数: BOOL PlayMS_Pause(int nPort, int nPause) + 参数: [in] int nPort: 通道号 + [in] int nPause: 1为暂停,0为恢复播放 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 暂停播放, 或者恢复播放。 + **********************************************************************************/ + public boolean PlayMS_Pause(int nPort,int nPause); + + /********************************************************************************** + 函数: PlayMS_Fast + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 播放提速。每调用一次,播放速度乘2,播放速度范围为[1/64,64] + 调用PlayMS_Play后从当前位置恢复到正常播放速度 + **********************************************************************************/ + public boolean PlayMS_Fast(int nPort); + + /********************************************************************************** + 函数: PlayMS_Slow + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 播放减速。每调用一次,播放速度除2,播放速度范围为[1/64, 64]。 + 调用PlayMS_Play后从当前位置恢复到正常播放速度 + **********************************************************************************/ + public boolean PlayMS_Slow(int nPort); + + /********************************************************************************** + 函数: PlayMS_SetPlaySpeed + 参数: [in] int nPort: 通道号 + [in] float fCoff: 播放速度,范围为[1/64,64] + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置视频播放速度 + **********************************************************************************/ + public boolean PlayMS_SetPlaySpeed(int nPort, float fCoff); + + /********************************************************************************** + 函数: PlayMS_OneByOne + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 单帧播放,每调用一次播放一帧。调用PlayMS_Play后恢复正常播放 + **********************************************************************************/ + public boolean PlayMS_OneByOne(int nPort); + + /********************************************************************************** + 函数: PlayMS_SetPlayPos + 参数: [in] int nPort: 通道号 + [in] float fRelativePos: 文件长度的百分比 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置播放文件的相对位置(百分比)。需在PlayMS_Play之后调用 + **********************************************************************************/ + public boolean PlayMS_SetPlayPos(int nPort, float fRelativePos); + + /********************************************************************************** + 函数: PlayMS_SetPlayDirection + 参数: [in] int nPort: 通道号 + [in] int nDirection: 播放方向(0: 向前,1: 向后) + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置视频文件的播放方向 + **********************************************************************************/ + public boolean PlayMS_SetPlayDirection(int nPort, int nDirection); + + /********************************************************************************** + 函数: PlayMS_GetPlayPos + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 获取播放文件的相对位置(百分比)。需在PlayMS_Play之后调用 + **********************************************************************************/ + public float PlayMS_GetPlayPos(int nPort); + + /********************************************************************************** + 函数: PlayMS_SetVolume + 参数: [in] int nPort: 通道号 + [in] short nVolum: 音量值,范围为[0,0xFFFF] + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置音量大小。该接口设置的音量是声卡输出的主音量, + 会对其他应用的音量有影响 + **********************************************************************************/ + public boolean PlayMS_SetVolume(int nPort, short nVolume); + + /********************************************************************************** + 函数: PlayMS_GetVolume + 参数: [in] int nPort: 通道号 + 返回值: 成功返回音量值,失败返回值 <= 0 + 说明: 获取声卡输出的音量 + **********************************************************************************/ + public short PlayMS_GetVolume(int nPort); + + /********************************************************************************** + 函数: PlayMS_PlaySound + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 以独占方式打开声音。也就是一次只能打开一路声音。 + 如果打开当前的声音,则自动关闭之前已经打开的声音。 + 建议和PlayMS_StopSound匹配使用 + **********************************************************************************/ + public boolean PlayMS_PlaySound(int nPort); + + /********************************************************************************** + 函数: PlayMS_StopSound + 参数: 无 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 关闭声音 + **********************************************************************************/ + public boolean PlayMS_StopSound(); + + /********************************************************************************** + 函数: PlayMS_GetFileTime + 参数: [in] int nPort: 通道号 + 返回值: 四舍五入后文件时长的长度值 + 说明: 获取文件的总时长,单位为秒。需在PlayMS_Play之后调用 + **********************************************************************************/ + public int PlayMS_GetFileTime(int nPort); + + /********************************************************************************** + 函数: PlayMS_GetPlayedTime + 参数: [in] int nPort: 通道号 + 返回值: 成功时返回文件已播放时间,失败时返回0 + 说明: 获取文件已播放的时间,单位为秒。需在PlayMS_Play之后调用 + **********************************************************************************/ + public int PlayMS_GetPlayedTime(int nPort); + + /********************************************************************************** + 函数: PlayMS_GetPlayedTimeEx + 参数: [in] int nPort: 通道号 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 获取文件当前播放的时间,单位为毫秒。需在PlayMS_Play之后调用 + **********************************************************************************/ + public int PlayMS_GetPlayedTimeEx(int nPort); + + /********************************************************************************** + 函数: PlayMS_GetPlayedFrames + 参数: [in] int nPort: 通道号 + 返回值: 文件已经解码的帧数 + 说明: 获取文件已经解码的帧数 + **********************************************************************************/ + public int PlayMS_GetPlayedFrames(int nPort); + + /********************************************************************************** + 函数: PlayMS_GetFileTotalFrames + 参数: [in] int nPort: 通道号 + 返回值: 文件总帧数 + 说明: 获取文件的总帧数。需在PlayMS_Play之后调用 + **********************************************************************************/ + public int PlayMS_GetFileTotalFrames(int nPort); + + /********************************************************************************** + 函数: BOOL PlayMS_SetPlayedTimeEx(int nPort,int nTime) + 参数: [in] int nPort: 通道号 + [in] int nTime: 播放时间 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置文件播放到指定时间,单位为毫秒。需在PlayMS_Play之后调用 + **********************************************************************************/ + public boolean PlayMS_SetPlayedTimeEx(int nPort, int nTime); + + /********************************************************************************** + 函数: int PlayMS_GetCurrentFrameNum(int nPort) + 参数: [in] int nPort: 通道号 + 返回值: 文件当前播放的帧序号 + 说明: 获取文件当前播放的帧序号。 + 如果视频不丢失,该数值接近PlayMS_GetPlayedFrames的返回值 + **********************************************************************************/ + public int PlayMS_GetCurrentFrameNum(int nPort); + + /********************************************************************************** + 函数: int PlayMS_SetCurrentFrameNum(int nPort,int nFrameNum) + 参数: [in] int nPort: 通道号 + [in] int nFrameNum: 帧序号 + 返回值: 成功返回TRUE,失败返回FALSE + 说明: 设置文件当前播放的帧序号 + **********************************************************************************/ + public boolean PlayMS_SetCurrentFrameNum(int nPort,int nFrameNum); + + /********************************************************************************** + 函数: PlayMS_SetFileEndCallBack + 参数: [in] int nPort: 通道号 + [in] fFileEndCallBack fFileEndCB: 回调函数指针 + nPort 通道号 + pUserData 用户自定义参数 + [in] Pointer pUserData: 用户自定义参数 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置文件结束回调。当文件播放结束时,触发回调函数。 + 需在PlayMS_OpenSteam或PlayMS_OpenFile之前调用 + **********************************************************************************/ + public boolean PlayMS_SetFileEndCallBack(int nPort, fFileEndCallBack pFileEndCBFun, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_SetFileEndMsg + 参数: [in] int nPort: 通道号 + [in] HWND hWnd: 消息发送窗口 + [in] UINT nMsg: 用户自定义需发送的消息数据 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 设置文件播放结束时,用户自定义发送的消息 + **********************************************************************************/ + public boolean PlayMS_SetFileEndMsg(int nPort, Pointer hWnd, int nMsg); + + /********************************************************************************** + 函数: PlayMS_SetWaterMarkCallBack + 描述: 设置水印数据回调。注意:水印校验回调设置后将不会进行解码显示 + 参数: nPort 端口号 + pFunc 水印信息获取回调函数, 参数含义如下: + pBuf 水印数据buffer指针 + nKey 区分不同水印信息 + nLen 缓冲的最大长度 + nRealLen 缓冲的实际长度 + nType 数值范围[0,3],含义如下 + 0 I帧帧数据水印信息 + 1 帧水印 + 2 水印校验 + 3 智能分析帧 + pUserData 用户自定义参数 + pUserData 用户自定义参数 + 返回: 成功返回TRUE,失败返回FALSE. + **********************************************************************************/ + public boolean PlayMS_SetWaterMarkCallBack(int nPort, fGetWaterMarkInfoCallBack pFunc, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_SetWaterMarkCallBackEx + 描述: 设置水印数据回调(成功后解码不显示) + 参数: nPort 端口号 + pGetWaterMarkCB 函数指针, 参数含义如下: + nPort 端口号 + buf 水印数据缓冲 + lTimeStamp 水印的时间戳 + lInfoType 水印信息类型 + len 缓冲的最大长度 + reallen 缓冲的实际长度 + lCheckResult 1-没有错误; 2-水印错误; 3-帧数据错误; 4-帧号错误 + pUserData 用户自定义参数 + pUserData 用户自定义参数 + 返回: 成功返回TRUE,失败返回FALSE. + **********************************************************************************/ + public boolean PlayMS_SetWaterMarkCallBackEx(int nPort, fGetWaterMarkInfoCallBackEx pGetWaterMarkCB, Pointer pUserData); + + /********************************************************************************** + 函数: PlayMS_ImageWatermarkCheck + 参数: [in] String pImagePath: 图片本地路径 + 返回值: 成功返回TRUE, 失败返回FALSE + 说明: 图片水印校验 + **********************************************************************************/ + public boolean PlayMS_ImageWatermarkCheck(final String pImagePath); + + /********************************************************************************** + 函数: PlayMS_RenderPrivateData + 描述: 显示智能数据图形 + 参数: nPort 端口号 + bShow 1 显示,0 不显示 + nReserved 保留参数 + 返回: 成功返回TRUE,失败返回FALSE. + **********************************************************************************/ + public boolean PlayMS_RenderPrivateData(int nPort, int bShow, int nReserved); + + /********************************************************************************** + 函数: PlayMS_SetRenderShapeLineType + 描述: 设置渲染类型使能 + 参数: nPort 端口号 + nRenderType 渲染类型 + ENUM_RENDER_TYPE + bEnable + LINE_TYPE_SOLID_WHOLE = 0x00: 实线,LINE_TYPE_SOLID_HALF - 0x01: 半线 + 返回: 成功返回TRUE,失败返回FALSE. + **********************************************************************************/ + public boolean PlayMS_SetRenderTypeEnable(int nPort, int nRenderType, int bEnable); +}; diff --git a/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayStructs.java b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayStructs.java new file mode 100644 index 0000000..ab657c1 --- /dev/null +++ b/ruoyi-code/src/main/java/sdk/java/lib/playmanager/PlayStructs.java @@ -0,0 +1,303 @@ +package sdk.java.lib.playmanager; + +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Pointer; +import com.sun.jna.Structure; + +import sdk.java.lib.LLONG; + +public class PlayStructs { + + ////////////////////////////////////////////////////////////////////////////////////// + public static class SYSTEMTIME extends Structure + { + public short wYear; + public short wMonth; + public short wDayOfWeek; + public short wDay; + public short wHour; + public short wMinute; + public short wSecond; + public short wMilliseconds; + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"wYear", "wMonth", "wDayOfWeek", "wDay", + "wHour", "wMinute", "wSecond", "wMilliseconds"}); + } + + public static class ByReference extends SYSTEMTIME implements Structure.ByReference + { + } + + public static class ByValue extends SYSTEMTIME implements Structure.ByValue + { + } + }; + + // 帧定位信息 + public static class FRAME_POS_INFO extends Structure + { + public LLONG nFilePos; // 帧在文件中的偏移位置 + public int nFrameLen; // 帧长度 + public int nFrameNum; // 帧序号 + public int nFrameTime; // 帧时间 + public int nErrorFrameNum; // 未启用 + public Pointer pErrorTime; // 未启用,SYSTEMTIME + public int nErrorLostFrameNum; // 未启用 + public int nErrorFrameSize; // 未启用 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nFilePos", "nFrameLen", "nFrameNum", "nFrameTime", + "nErrorFrameNum", "pErrorTime", "nErrorLostFrameNum", "nErrorFrameSize"}); + } + + public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference + { + } + + public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue + { + } + }; + + // 解码帧属性信息 + public static class FRAME_ATTRI_INFO extends Structure + { + public int nWidth; // 画面宽,单位像素 + public int nHeight; // 画面高,单位像素 + public int nStamp; // 时标信息,单位毫秒 + public int nType; // 视频帧类型,TYPE_IYUV,TYPE_AUDIODATA_16,TYPE_RGB32 + public int nFrameRate; // 图像帧率 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nWidth", "nHeight", "nStamp", "nType", "nFrameRate"}); + } + + public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference + { + } + + public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue + { + } + }; + + // 解码帧属性信息 + public static class FRAME_ATTRI_INFO_EX extends Structure + { + public int nFrameType; // 帧类型 + // 1 - MEDIA_FRAME_TYPE_VIDEO(视频帧) + // 2 - MEDIA_FRAME_TYPE_AUDIO(音频帧) + public int nSubFrameType; // 帧子类型(参见 ENUM_SUB_FRAME_TYPE 枚举值) + public int nEncodeType; // 解码类型(参见 ENUM_VIDEO_ENCODE_TYPE 枚举值) + public int nStreamType; // 码流封装类型(参见 ENUM_STREAM_PACKAGE_TYPE 枚举值) + + public Pointer pFrameData; // 帧数据 + public int nFrameDataLen; // 帧数据长度 + public Pointer pFrameBodyData; // 帧裸数据 + public int nFrameBodyLen; // 帧裸数据长度 + + public int nFrameSeq; // 帧序号 + public int nStamp; // 时标信息(单位:ms) + public int nWidth; // 面宽(单位:像素) + public int nHeight; // 画面高(单位:像素) + public int nFrameRate; // 图像帧率 + public int nChannels; // 音频通道数 + public int nBitPerSample; // 音频采样位数 + public int nSamplesPerSec; // 音频采样频率 + public int nRemainData; // 缓冲剩余数据量 + public SYSTEMTIME nDataTime; // 时间 + public int[] nReserved = new int[48]; // 保留位 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nFrameType", "nSubFrameType", "nEncodeType", "nStreamType", + "pFrameData", "nFrameDataLen", "pFrameBodyData", "nFrameBodyLen", "nFrameSeq", "nStamp", + "nWidth", "nHeight", "nFrameRate", "nChannels", "nBitPerSample", "nSamplesPerSec", + "nRemainData", "nDataTime", "nReserved"}); + } + + public static class ByReference extends FRAME_POS_INFO implements Structure.ByReference + { + } + + public static class ByValue extends FRAME_POS_INFO implements Structure.ByValue + { + } + }; + + // 解码帧内容 + public static class FRAME_DEC_INFO extends Structure + { + public int nFrameType; // 帧类型 + // 1 - MEDIA_FRAME_TYPE_VIDEO(视频帧) + // 2 - MEDIA_FRAME_TYPE_AUDIO(音频帧) + public int nSubFrameType; // 帧子类型(参见 ENUM_SUB_FRAME_TYPE 枚举值) + + public Pointer pAudioData; // 音频数据(音频帧有效) + public int nAudioDataLen; // 音频数据长度 + + public Pointer[] pVideoData = new Pointer[3]; // 分别表示视频的YUV三个分量(视频帧有效) + public int[] nStride = new int[3]; // 分别表示YUV三个分量的跨距(视频帧有效) + public int[] nWidth = new int[3]; // 分别表示YUV三个分量的宽度(视频帧有效) + public int[] nHeight = new int[3]; // 分别表示YUV三个分量的高度(视频帧有效) + public int[] nReserved = new int[64]; // 保留位 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nFrameType", "nSubFrameType", "pAudioData", + "nAudioDataLen", "pVideoData", "nStride", "nWidth", "nHeight", "nReserved"}); + } + + public static class ByReference extends FRAME_DEC_INFO implements Structure.ByReference + { + } + + public static class ByValue extends FRAME_DEC_INFO implements Structure.ByValue + { + } + }; + + // 智能帧属性 + public static class SA_DD_INTL_OBJECT extends Structure + { + public byte nAttriType; // 类型 + public byte nEnable; // 0 - 无效;1 - 有效 + public byte[] reseved = new byte[2]; // 保留参数 + public int nAttriId; // id + public int nFrameNum; // 帧序号 + public int nPTS; // PTS + public Pointer pData; // 智能帧结构体数据 + public int nDataLen; // 智能帧结构体数据长度 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nAttriType", "nEnable", "reseved", + "nAttriId", "nFrameNum", "nPTS", "pData", "nDataLen"}); + } + + public static class ByReference extends SA_DD_INTL_OBJECT implements Structure.ByReference + { + } + + public static class ByValue extends SA_DD_INTL_OBJECT implements Structure.ByValue + { + } + }; + + // 轨迹矩形 + public static class SA_DD_IF_RECT extends Structure + { + // 轨迹点是物体外接矩形的中心 + // RECT = (X - XSize, Y - YSize, X + XSize, Y + YSize) + public short x; + public short y; + public short xSize; + public short ySize; + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"x", "y", "xSize", "ySize"}); + } + + public static class ByReference extends SA_DD_IF_RECT implements Structure.ByReference + { + } + + public static class ByValue extends SA_DD_IF_RECT implements Structure.ByValue + { + } + } + + public static class SA_DD_ANGLE3D extends Structure + { + // 上下俯仰角 + public float pitch; + // 左右摇摆角 + public float roll; + // 水平旋转角 + public float yaw; + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"pitch", "roll", "yaw"}); + } + + public static class ByReference extends SA_DD_ANGLE3D implements Structure.ByReference + { + } + + public static class ByValue extends SA_DD_ANGLE3D implements Structure.ByValue + { + } + } + + // 人员信息 + public static class SA_DD_OBJECT_PERSON_INFO extends Structure + { + public byte nSex; // 人员性别,0-未知,1-男性,2-女性 + public byte nAge; // 年龄,0-未知 + public byte[] reserved1 = new byte[2]; // 字节对齐 + public byte[] szCode = new byte[128]; // 人员编号 + public byte[] szName = new byte[128]; // 人员姓名 + public byte[] reserved = new byte[256]; // 保留位 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"nSex", "nAge", "reserved1", "szCode", "szName", "reserved"}); + } + + public static class ByReference extends SA_DD_OBJECT_PERSON_INFO implements Structure.ByReference + { + } + + public static class ByValue extends SA_DD_OBJECT_PERSON_INFO implements Structure.ByValue + { + } + } + + // 人脸 + public static class SA_DD_OBJECT_FACE extends Structure + { + public int frame_num; // 帧序号 + public int pts; // PTS + public int obj_id; // 物体 id + public byte obj_type; // 物体类型 + public byte enable; // 0 表示无效物体, 1表示有效物体 + public byte shape_type; // 轨迹类型 + public byte shape_confidence; // 图形置信度 + public byte shape_quality; // 图形质量 + public byte[] reserved1 = new byte[3]; // 预留位1 + public int shape_color; // 图形颜色 + public SA_DD_IF_RECT shape_rect; // 图形矩形, 8192 坐标系 + public byte enableMask; // 0x01-0x08 的使能掩码 + public SA_DD_ANGLE3D angle3D; // 人脸三维角度 + public float shape_fuzzy_degree; // 模糊度 + public short pixelSize; // 像素大小 + public float score; // 人脸整体得分 + public byte enableMask0xFe; // 0x09-0x10 的使能掩码 + public byte[] reserved2 = new byte[12]; // 预留位2 + public SA_DD_OBJECT_PERSON_INFO person; // 人员信息 + public byte[] reserved3 = new byte[64]; // 预留位3 + + protected List getFieldOrder() + { + return Arrays.asList(new String [] {"frame_num", "pts", "obj_id", "obj_type", "enable", "shape_type", "shape_confidence", "shape_quality", + "reserved1", "shape_color", "shape_rect", "enableMask", "angle3D", "shape_fuzzy_degree", "pixelSize", "score", "enableMask0xFe", + "reserved2", "person", "reserved3"}); + } + + public static class ByReference extends SA_DD_OBJECT_FACE implements Structure.ByReference + { + } + + public static class ByValue extends SA_DD_OBJECT_FACE implements Structure.ByValue + { + } + } +}