1
zhanghua
2024-09-26 c775c6953d9759e70f08acbfa8f6d7490aaae3d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
package com.netsdk.demo.customize.configuration;
 
import com.netsdk.demo.util.CaseMenu;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.netsdk.lib.Utils;
import com.netsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
import com.netsdk.lib.structure.NET_OSD_USER_DEF_TITLE;
import com.netsdk.lib.structure.NET_USER_DEF_TITLE_INFO;
import com.netsdk.module.ConfigModule;
 
import java.nio.charset.Charset;
 
/**
 * OSD 相关配置 获取/下发
 *
 * @author 47040
 * @version 1.0.0
 * @since Created in 2021/3/9 10:22
 */
public class OSDConfiguration {
 
    // netsdk 接口
    private final NetSDKLib netSdkApi = NetSDKLib.NETSDK_INSTANCE;
 
    private final ConfigInitAndLogon initModule = new ConfigInitAndLogon(netSdkApi);
 
    // 多平台 编码
    private Charset encode = Charset.forName(Utils.getPlatformEncode());
 
    /**
     * 二次封装模块,包含一些设备配置的接口
     */
    private final ConfigModule configModule = new ConfigModule(netSdkApi);
 
    /**
     * 登录句柄值
     */
    private long loginHandler;
 
    ////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////// OSD 配置 获取/下发 //////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////
 
    /**
     * 获取 用户自定义OSD标题配置
     */
    public void getUserDefineTitleConfig() {
        NET_OSD_USER_DEF_TITLE config = new NET_OSD_USER_DEF_TITLE();
        config = (NET_OSD_USER_DEF_TITLE)
                configModule.getConfig(
                        loginHandler,                                         // 登录句柄
                        NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_USER_DEF_TITLE,    // 枚举->用户自定义OSD标题
                        config,                                               // 配置结构体
                        0                                             // 通道号
                );
        if (config == null) {
            System.err.println("获取自定义OSD标题配置失败:" + ToolKits.getErrorCode());
            return;
        }
 
        // 打印看下原先的配置
        StringBuilder info = new StringBuilder().append("---------- 用户自定义OSD标题配置信息 ----------").append("\n");
 
        int userTitleCount = config.nUserDefTitleNum;
        if (userTitleCount > 0) {
            info.append(String.format("( 共包含%d个配置 )", userTitleCount)).append("\n");
            for (int i = 0; i < userTitleCount; i++) {
 
                String text = new String(config.stuUserDefTitle[i].szText, encode);
                String bEncodeBlend = (config.stuUserDefTitle[i].bEncodeBlend == 0) ? "未使能" : "使能";
                String bPreviewBlend = (config.stuUserDefTitle[i].bPreviewBlend == 0) ? "未使能" : "使能";
                String rect = config.stuUserDefTitle[i].stuRect.toString();
                String frontColor = config.stuUserDefTitle[i].stuFrontColor.toString();
                String backColor = config.stuUserDefTitle[i].stuBackColor.toString();
                String emTextAlign = String.valueOf(config.stuUserDefTitle[i].emTextAlign);
 
                info.append(String.format(">>>>> 第【%d】配置详情 <<<<<", i + 1)).append("\n")
                        .append(String.format("    %s: ", "标题内容")).append(text).append("\n")
                        .append(String.format("    %s: ", "叠加到编码视频使能")).append(bEncodeBlend).append("\n")
                        .append(String.format("    %s: ", "叠加到预览视频使能")).append(bPreviewBlend).append("\n")
                        .append(String.format("    %s: ", "标题所在区域")).append(rect).append("\n")
                        .append(String.format("    %s: ", "前景色")).append(frontColor).append("\n")
                        .append(String.format("    %s: ", "背景色")).append(backColor).append("\n")
                        .append(String.format("    %s: ", "文本对齐方式 参考 EM_TITLE_TEXT_ALIGNTYPE")).append(emTextAlign).append("\n");
            }
        }
        System.out.println(info.toString());
    }
 
    /**
     * 下发 用户自定义OSD标题配置
     */
    public void setUserDefineTitleConfig() {
 
        // 我们推荐修改配置的方式都是 获取->修改->下发 这样的流程
        // OSD标题配置经我测试 必须重置后才能再次配置 否则不会生效 这个和设备型号与设备软件版本都有关 请以实际测试为准
 
        //////////////////////////////////////// 重置配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        this.OSDTitleResetConfig();
 
        //////////////////////////////////////// 获取配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        NET_OSD_USER_DEF_TITLE config = new NET_OSD_USER_DEF_TITLE();
        config = (NET_OSD_USER_DEF_TITLE)
                configModule.getConfig(
                        loginHandler,                                         // 登录句柄
                        NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_USER_DEF_TITLE,    // 枚举->用户自定义OSD标题
                        config,                                               // 配置结构体
                        0                                             // 通道号
                );
        if (config == null) {
            System.err.println("获取自定义OSD标题配置失败:" + ToolKits.getErrorCode());
            return;
        }
        if (config.nUserDefTitleNum == 0) {
            System.err.println("不存在自定义OSD标题配置 设备异常");
            return;
        }
        System.out.println("获取自定义OSD标题配置成功");
 
        //////////////////////////////////////// 修改配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
        // 这里我以修改两个配置为例
 
        // 第一个配置
        NET_USER_DEF_TITLE_INFO titleInfo = config.stuUserDefTitle[0];
 
        byte[] text = "我是用户自定义标题".getBytes(encode);
        // 给 byte[] 参数赋值请务必使用 System.arraycopy, 以防止破坏数据的原始长度
        System.arraycopy(text, 0, titleInfo.szText, 0, text.length);
 
        titleInfo.bEncodeBlend = 1;     // 叠加到编码视频
        titleInfo.bPreviewBlend = 1;    // 叠加到预览视频
 
        // 配置 OSD 的左顶点边距 (8192x8192相对坐标)
        titleInfo.stuRect.left = 500;
        titleInfo.stuRect.top = 500;
 
        titleInfo.stuFrontColor.setRGBA(240, 248, 255, 200);   // 前景色 爱丽丝蓝
        titleInfo.stuBackColor.setRGBA(199, 21, 133, 200);     // 背景色 紫罗兰红
 
        titleInfo.emTextAlign = NetSDKLib.EM_TITLE_TEXT_ALIGNTYPE.EM_TEXT_ALIGNTYPE_LEFT; // 左对齐
 
        // 第二个配置
        NET_USER_DEF_TITLE_INFO titleInfo2 = config.stuUserDefTitle[1];
 
        byte[] text2 = "我也是用户自定义标题".getBytes(encode);
        // 给 byte[] 参数赋值请务必使用 System.arraycopy, 以防止破坏数据的原始长度
        System.arraycopy(text2, 0, titleInfo2.szText, 0, text2.length);
 
        titleInfo2.bEncodeBlend = 1;     // 叠加到编码视频
        titleInfo2.bPreviewBlend = 1;    // 叠加到预览视频
 
        // 配置 OSD 的左顶点边距 (8192x8192相对坐标)
        // 大部分设备从第二个配置开始, Rect 会自动匹配第一个配置的对齐方式,所以这里即使配置了也不会生效 可以不用填
        // titleInfo2.stuRect.left = 1500;
        // titleInfo2.stuRect.top = 1500;
 
        // 颜色也会自动和第一个配置的颜色保持一致,可以不用填
        // titleInfo2.stuFrontColor.setRGBA(100, 100, 100, 100);  // 前景色 爱丽丝蓝
        // titleInfo2.stuBackColor.setRGBA(0, 100, 100, 100);     // 背景色 宝石绿
 
        // 对齐方式会自动匹配第一个配置里的对齐方式,可以不用填
        // titleInfo2.emTextAlign = NetSDKLib.EM_TITLE_TEXT_ALIGNTYPE.EM_TEXT_ALIGNTYPE_LEFT; // 左对齐
 
        //////////////////////////////////////// 下发配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        boolean ret = configModule.setConfig(
                loginHandler,                                         // 登录句柄
                NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_USER_DEF_TITLE,    // 枚举->用户自定义OSD标题
                config,                                               // 配置结构体
                0,                                            // 通道号
                5000
        );
        if (!ret) {
            System.err.println("配置OSD自定义标题失败:" + ToolKits.getErrorCode());
            return;
        }
        System.out.println("配置OSD自定义标题成功");
    }
 
    public void OSDTitleResetConfig() {
 
        //////////////////////////////////////// 获取配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        NET_OSD_USER_DEF_TITLE config = new NET_OSD_USER_DEF_TITLE();
        config = (NET_OSD_USER_DEF_TITLE)
                configModule.getConfig(
                        loginHandler,                                         // 登录句柄
                        NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_USER_DEF_TITLE,    // 枚举->用户自定义OSD标题
                        config,                                               // 配置结构体
                        0                                             // 通道号
                );
        if (config == null) {
            System.err.println("获取自定义OSD标题配置失败:" + ToolKits.getErrorCode());
            return;
        }
        if (config.nUserDefTitleNum == 0) {
            System.err.println("不存在自定义OSD标题配置 设备异常");
            return;
        }
        System.out.println("获取自定义OSD标题配置成功");
 
        //////////////////////////////////////// 初始化配置 ///////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        for (int i = 0; i < config.nUserDefTitleNum; i++) {
 
            config.stuUserDefTitle[i].szText = new byte[1024];
            config.stuUserDefTitle[i].bEncodeBlend = 0;
            config.stuUserDefTitle[i].bPreviewBlend = 0;
            config.stuUserDefTitle[i].stuRect.left = 148;
            config.stuUserDefTitle[i].stuRect.top = 352;
            config.stuUserDefTitle[i].stuRect.right = 1773;
            config.stuUserDefTitle[i].stuRect.bottom = 769;
            config.stuUserDefTitle[i].stuFrontColor.setRGBA(255, 255, 255, 0);
            config.stuUserDefTitle[i].stuBackColor.setRGBA(0, 0, 0, 128);
            config.stuUserDefTitle[i].emTextAlign = 0;
        }
        //////////////////////////////////////// 下发配置 /////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////////////////////////////
 
        boolean ret = configModule.setConfig(
                loginHandler,                                         // 登录句柄
                NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_USER_DEF_TITLE,    // 枚举->用户自定义OSD标题
                config,                                               // 配置结构体
                0,                                            // 通道号
                5000
        );
        if (!ret) {
            System.err.println("重置OSD自定义标题失败:" + ToolKits.getErrorCode());
            return;
        }
        System.out.println("重置OSD自定义标题成功");
    }
 
    ////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////// 简易控制台 ////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////
 
    // 初始化测试
    public void InitTest() {
        initModule.init(initModule.defaultDisconnectCB, initModule.defaultReconnectCB);                // 初始化SDK库
        loginHandler = initModule.loginWithHighSecurity(m_strIp, m_nPort, m_strUser, m_strPassword);   // 高安全登录
        if (loginHandler == 0) {
            System.err.println("登录失败, 请检查接口参数, See You..");
            initModule.cleanAndExit();
        }
    }
 
    // 加载测试内容
    public void RunTest() {
        CaseMenu menu = new CaseMenu();
        menu.addItem(new CaseMenu.Item(this, "获取 用户自定义OSD标题配置", "getUserDefineTitleConfig"));
        menu.addItem(new CaseMenu.Item(this, "下发 用户自定义OSD标题配置", "setUserDefineTitleConfig"));
        menu.addItem(new CaseMenu.Item(this, "重置 用户自定义OSD标题配置", "OSDTitleResetConfig"));
        menu.run();
    }
 
    // 结束测试
    public void EndTest() {
        System.out.println("End Test");
        initModule.logout(loginHandler);        // 登出
        System.out.println("See You...");
        initModule.cleanAndExit();              // 清理资源并退出
    }
 
    //////////////////// 配置登陆地址,端口,用户名,密码 ///////////////////////
//    private String m_strIp = "172.8.1.230";
    private String m_strIp = "172.23.12.112";
    private int m_nPort = 37777;
    private String m_strUser = "admin";
    private String m_strPassword = "admin123";
    /////////////////////////////////////////////////////////////////////////
 
    public static void main(String[] args) {
        OSDConfiguration demo = new OSDConfiguration();
 
        if (args.length == 4) {
            demo.m_strIp = args[0];
            demo.m_nPort = Integer.parseInt(args[1]);
            demo.m_strUser = args[2];
            demo.m_strPassword = args[3];
        }
 
        demo.InitTest();
        demo.RunTest();
        demo.EndTest();
    }
 
}