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();
|
}
|
|
}
|