Onvif协议学习:12、修改分辨率

2023-11-19

Onvif协议学习:12、修改分辨率



原文链接:https://blog.csdn.net/benkaoya/article/details/72490332

1、原理简介

IPC有关多媒体的参数,都是由媒体配置文件(media profile)来管理。想通过ONVIF协议修改IPC诸如分辨率这样的媒体参数,就得先弄懂媒体配置文件。

媒体配置文件(media profile)是用于管理音视频流相关的一系列配置的集合,一个配置文件由一系列相关联的配置类实体构成。配置类包括:

  • Video source configuration(视频源配置)
  • Audio source configuration(音频源配置)
  • Video encoder configuration(视频编码器配置)
  • Audio encoder configuration(音频编码器配置)
  • PTZ configuration(PTZ配置)
  • Video analytics configuration(视频分析配置)
  • Metadata configuration(元数据配置)
  • Audio output configuration(音频输出配置)
  • Audio decoder configuration(音频解码器配置)

对应的结构体为:

struct tt__Profile {
        char *Name;
        struct tt__VideoSourceConfiguration *VideoSourceConfiguration;
        struct tt__AudioSourceConfiguration *AudioSourceConfiguration;
        struct tt__VideoEncoderConfiguration *VideoEncoderConfiguration;
        struct tt__AudioEncoderConfiguration *AudioEncoderConfiguration;
        struct tt__VideoAnalyticsConfiguration *VideoAnalyticsConfiguration;
        struct tt__PTZConfiguration *PTZConfiguration;
        struct tt__MetadataConfiguration *MetadataConfiguration;
        struct tt__ProfileExtension *Extension;
        char *token;
        enum xsd__boolean *fixed;
};

一个tt__Profile结构体就是一个媒体配置文件,一个配置文件由全部的或部分的配置类实体组成,“部分”的意思是,对于不支持的功能(如PTZ),允许其配置信息为空(PTZConfiguration为NULL)。

这里有一个概念一定要理清楚,配置类和实体的区别:

  • 就某个配置类而言,一个设备可以有多个实体。如「视频编码器配置」类,一个IPC设备至少包含两个「视频编码器配置」实体,分别关联主码流和辅码流,这两个「视频编码器配置」实体参数有所区别,如分辨率不同,码率不同等等。

  • 一个媒体配置文件由一不同配置类的实体组成,同一配置类的不同实体,只能有一个实体跟媒体配置文件关联。

  • 一个设备可以有多个媒体配置文件,如主码流、辅码流就是两个不同的媒体配置文件。

为了唯一标识某个配置实体,每个配置实体都有对应的唯一标识符token,很多的ONVIF媒体接口也是通过这些token来访问(修改)这些配置的。比如,视频源配置token、音频源配置token、视频编码器配置token,甚至连媒体配置文件本身都有token。如下图红色矩形框所示(GetProfiles接口):

在这里插入图片描述

2、函数接口

对于某个具体的配置类,ONVIF都提供了一套完整的函数接口,类似如下:

  • AddXXXConfiguration:新增XXX配置
  • RemoveXXXConfiguration:删除指定的XXX配置
  • GetXXXConfigurations:获取所有的XXX配置
  • GetXXXConfiguration:获取指定的XXX配置
  • GetXXXConfigurationOptions:获取XXX配置选项集
  • GetCompatibleXXXConfigurations:获取所有兼容的XXX配置
  • SetXXXConfiguration:修改指定的XXX配置

将XXX替换成VideoEncoder,就得到了「视频编码器配置」类相关的ONVIF接口,其他配置类也如此:

  • AddVideoEncoderConfiguration:新增视频编码器配置
  • RemoveVideoEncoderConfiguration:删除指定的视频编码器配置
  • GetVideoEncoderConfigurations:获取所有的视频编码器配置
  • GetVideoEncoderConfiguration:获取指定的视频编码器配置
  • GetVideoEncoderConfigurationOptions:获取视频编码器配置选项集
  • GetCompatibleVideoEncoderConfigurations:获取所有兼容的视频编码器配置
  • SetVideoEncoderConfiguration:修改指定的视频编码器配置

「媒体配置文件」与「视频编码器配置」的关系:

ONVIF对应的函数接口 备注
一个设备可以有多个「媒体配置文件」 GetProfile GetProfiles 比如主码流、辅码流,是两个相互独立的媒体配置文件。每个媒体配置文件的token不同。
一个设备可以有多个「视频编码器配置」实体 GetVideoEncoderConfiguration GetVideoEncoderConfigurations
一个「媒体配置文件」只能关联一个「视频编码器配置」实体 AddVideoEncoderConfiguration
每个「视频编码器配置」实体独享属于自己的一套参数选项集 GetVideoEncoderConfigurationOptions 比如IPC的主码流,视频分辨率只能设置为预先设定好的几个分辨率(选项集)中的一种,不能随意配置。可选择的分辨率是IPC出厂时就与设定好的,没法通过ONVIF接口增/删/改。 “独享”的意思,就是视频编码器配置1的分辨率,只能在视频编码器配置1中使用,不能在视频编码器配置2中使用。比如主码流的1080P分辨率,不能配置到辅码流中。

3、编码流程

IPC客户端通过ONVIF修改分辨率的步骤如下:

  • 先通过GetProfiles获取所有媒体配置文件,可得知主/辅码流的视频编码器配置token;
  • 由视频编码器配置token通过SetVideoEncoderConfiguration修改视频编码器配置(如修改分辨率、帧率、码率等);
  • 修改的参数必须在GetVideoEncoderConfigurationOptions中的选项集范围内(即IPC出厂时预设定好的那几个选项集),如分辨率只能设置为那几种中的一种,不能随意设置。否则SetVideoEncoderConfiguration会返回失败。
  • 每个视频编码器配置的分辨率可选集,只能自个使用,不能用于其他视频编码器配置中。比如主码流的1080P分辨率,不能配置到辅码流中,SetVideoEncoderConfiguration会调用失败。

4、示例代码

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "onvif_comm.h"
#include "onvif_dump.h"

/************************************************************************
**函数:ONVIF_GetVideoEncoderConfigurationOptions
**功能:获取指定视频编码器配置的参数选项集
**参数:
        [in] MediaXAddr   - 媒体服务地址
        [in] ConfigurationToken - 视频编码器配置的令牌字符串,如果为NULL,则获取所有视频编码器配置的选项集(会杂在一起,无法区分选项集是归属哪个视频编码配置器的)
**返回:
        0表明成功,非0表明失败
**备注:
    1). 有两种方式可以获取指定视频编码器配置的参数选项集:一种是根据ConfigurationToken,另一种是根据ProfileToken
************************************************************************/
int ONVIF_GetVideoEncoderConfigurationOptions(const char *MediaXAddr, char *ConfigurationToken)
{
    int result = 0;
    struct soap *soap = NULL;
    struct _trt__GetVideoEncoderConfigurationOptions          req;
    struct _trt__GetVideoEncoderConfigurationOptionsResponse  rep;

    SOAP_ASSERT(NULL != MediaXAddr);
    SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));

    memset(&req, 0x00, sizeof(req));
    memset(&rep, 0x00, sizeof(rep));
    req.ConfigurationToken = ConfigurationToken;

    ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);
    result = soap_call___trt__GetVideoEncoderConfigurationOptions(soap, MediaXAddr, NULL, &req, &rep);
    SOAP_CHECK_ERROR(result, soap, "GetVideoEncoderConfigurationOptions");

    dump_trt__GetVideoEncoderConfigurationOptionsResponse(&rep);

EXIT:

    if (NULL != soap) {
        ONVIF_soap_delete(soap);
    }

    return result;
}

/************************************************************************
**函数:ONVIF_GetVideoEncoderConfiguration
**功能:获取设备上指定的视频编码器配置信息
**参数:
        [in] MediaXAddr - 媒体服务地址
        [in] ConfigurationToken - 视频编码器配置的令牌字符串
**返回:
        0表明成功,非0表明失败
**备注:
************************************************************************/
int ONVIF_GetVideoEncoderConfiguration(const char *MediaXAddr, char *ConfigurationToken)
{
    int result = 0;
    struct soap *soap = NULL;
    struct _trt__GetVideoEncoderConfiguration          req;
    struct _trt__GetVideoEncoderConfigurationResponse  rep;

    SOAP_ASSERT(NULL != MediaXAddr);
    SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));

    ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);

    memset(&req, 0x00, sizeof(req));
    memset(&rep, 0x00, sizeof(rep));
    req.ConfigurationToken = ConfigurationToken;
    result = soap_call___trt__GetVideoEncoderConfiguration(soap, MediaXAddr, NULL, &req, &rep);
    SOAP_CHECK_ERROR(result, soap, "GetVideoEncoderConfiguration");

    dump_trt__GetVideoEncoderConfigurationResponse(&rep);

EXIT:

    if (NULL != soap) {
        ONVIF_soap_delete(soap);
    }

    return result;
}

/************************************************************************
**函数:ONVIF_SetVideoEncoderConfiguration
**功能:修改指定的视频编码器配置信息
**参数:
        [in] MediaXAddr - 媒体服务地址
        [in] venc - 视频编码器配置信息
**返回:
        0表明成功,非0表明失败
**备注:
    1). 所设置的分辨率必须是GetVideoEncoderConfigurationOptions返回的“分辨率选项集”中的一种,否则调用SetVideoEncoderConfiguration会失败。
************************************************************************/
int ONVIF_SetVideoEncoderConfiguration(const char *MediaXAddr, struct tagVideoEncoderConfiguration *venc)
{
    int result = 0;
    struct soap *soap = NULL;

    struct _trt__GetVideoEncoderConfiguration           gVECfg_req;
    struct _trt__GetVideoEncoderConfigurationResponse   gVECfg_rep;

    struct _trt__SetVideoEncoderConfiguration           sVECfg_req;
    struct _trt__SetVideoEncoderConfigurationResponse   sVECfg_rep;

    SOAP_ASSERT(NULL != MediaXAddr);
    SOAP_ASSERT(NULL != venc);
    SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));

    memset(&gVECfg_req, 0x00, sizeof(gVECfg_req));
    memset(&gVECfg_rep, 0x00, sizeof(gVECfg_rep));
    gVECfg_req.ConfigurationToken = venc->token;

    ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);
    result = soap_call___trt__GetVideoEncoderConfiguration(soap, MediaXAddr, NULL, &gVECfg_req, &gVECfg_rep);
    SOAP_CHECK_ERROR(result, soap, "GetVideoEncoderConfiguration");

    if (NULL == gVECfg_rep.Configuration) {
        SOAP_DBGERR("video encoder configuration is NULL.\n");
        goto EXIT;
    }

    memset(&sVECfg_req, 0x00, sizeof(sVECfg_req));
    memset(&sVECfg_rep, 0x00, sizeof(sVECfg_rep));

    sVECfg_req.ForcePersistence = xsd__boolean__true_;
    sVECfg_req.Configuration    = gVECfg_rep.Configuration;

    if (NULL != sVECfg_req.Configuration->Resolution) {
        sVECfg_req.Configuration->Resolution->Width  = venc->Width;
        sVECfg_req.Configuration->Resolution->Height = venc->Height;
    }

    ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);
    result = soap_call___trt__SetVideoEncoderConfiguration(soap, MediaXAddr, NULL, &sVECfg_req, &sVECfg_rep);
    SOAP_CHECK_ERROR(result, soap, "SetVideoEncoderConfiguration");

EXIT:

    if (SOAP_OK == result) {
        SOAP_DBGLOG("\nSetVideoEncoderConfiguration success!!!\n");
    }

    if (NULL != soap) {
        ONVIF_soap_delete(soap);
    }

    return result;
}

void cb_discovery(char *DeviceXAddr)
{
    int stmno = 0;                                                              // 码流序号,0为主码流,1为辅码流
    int profile_cnt = 0;                                                        // 设备配置文件个数
    struct tagProfile *profiles = NULL;                                         // 设备配置文件列表
    struct tagCapabilities capa;                                                // 设备能力信息

    ONVIF_GetCapabilities(DeviceXAddr, &capa);                                  // 获取设备能力信息(获取媒体服务地址)

    profile_cnt = ONVIF_GetProfiles(capa.MediaXAddr, &profiles);                // 获取媒体配置信息(主/辅码流配置信息)

    if (profile_cnt > stmno) {
        struct tagVideoEncoderConfiguration venc;
        char *vencToken = profiles[stmno].venc.token;

        ONVIF_GetVideoEncoderConfigurationOptions(capa.MediaXAddr, vencToken);  // 获取该码流支持的视频编码器参数选项集

        ONVIF_GetVideoEncoderConfiguration(capa.MediaXAddr, vencToken);         // 获取该码流当前的视频编码器参数

        venc = profiles[stmno].venc;
        venc.Height = 960;
        venc.Width  = 1280;
        ONVIF_SetVideoEncoderConfiguration(capa.MediaXAddr, &venc);             // 设置该码流当前的视频编码器参数

        ONVIF_GetVideoEncoderConfiguration(capa.MediaXAddr, vencToken);         // 观察是否修改成功
    }

    if (NULL != profiles) {
        free(profiles);
        profiles = NULL;
    }
}

int main(int argc, char **argv)
{
    ONVIF_DetectDevice(cb_discovery);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Onvif协议学习:12、修改分辨率 的相关文章

  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • ONVIF简介

    一 什么是ONVIF ONVIF规范描述了网络视频的模型 接口 数据类型以及数据交互的模式 并复用了一些现有的标准 xff0c 如WS系列标准等 ONVIF规范的目标是实现一个网络视频框架协议 xff0c 使不同厂商所生产的网络视频产品 x
  • ONVIF与RTSP的关系。

    先说结论 xff0c 个人觉得RTSP这个传输协议是ONVIF这个架构的部分功能 xff08 音视频流 xff09 的实现 也就是支持ONVIF的摄像头 xff0c 必定提供了RTSP视频流的接口 附 xff1a 海康威视RTSP的URL规
  • Onvif鉴权实现方式

    Onvif鉴权实现方式 Digest 61 B64ENCODE SHA1 B64DECODE Nonce 43 Date 43 Password gsoap中digest生成代码 xff1a int soap wsse add Userna
  • linux下移植onvif至arm环境

    前言 onvif是一种网络摄像头协议 xff0c linux网络摄像头这一块是需要移植onvif协议的 xff0c 整个移植过程是这样的 xff0c 首先onvif协议是依赖于gsoap的 xff0c 所以需要先将gsoap编译安装 xff
  • java 通过onvif抓取海康摄像头图片

    java 通过onvif抓取海康摄像头图片 文章目录 java 通过onvif抓取海康摄像头图片前言一 把onvif jar放到自己的maven仓库二 pom文件引入jar包三 测试代码四 运行中的变量五 参考链接地址 前言 网上也有类似的
  • ONVIF对讲功能漫谈

    ONVIF对讲功能漫谈 前言 一 onvif对讲功能和onvif协议关系大吗 二 如何上报设备支持onvif对讲功能呢 三 onvif协议中哪个接口上报音频解码配置 四 献上抓包报文 前言 本篇文章尝试使用提问的方式来分享onvif对讲功能
  • Onvif协议学习:7、鉴权认证

    Onvif协议学习 7 鉴权认证 文章目录 Onvif协议学习 7 鉴权认证 1 前言 2 ONVIF哪些接口需要认证 3 如何认证 4 安装OpenSSL 5 实现认证 6 特别注意 原文链接 https blog csdn net be
  • go+gSoap+onvif学习总结:7、进行镜头调焦、聚焦和预置点的增删改查

    cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 文章目录 cgo gSoap onvif学习总结 7 进行镜头调焦 聚焦和预置点的增删改查 1 前言 2 gSoap生成c代码框架 3 完成c代码实例并测试
  • ONVIF测试工具 ONVIF Device Test Tool的使用

    ONVIF测试工具 ONVIF Device Test Tool的使用 双击 打开软件 选择当前网络 点击 Discover Devices 进行搜索 可以看到搜索到一个设备
  • Onvif协议学习:8、设备校时

    Onvif协议学习 8 设备校时 文章目录 Onvif协议学习 8 设备校时 1 编码流程 2 注意事项 3 示例代码 原文链接 https blog csdn net benkaoya article details 72486511 1
  • cgo+gSoap+onvif学习总结:2、wsl编译安装gSoap

    cgo gSoap onvif学习总结 2 wsl编译安装gSoap 文章目录 cgo gSoap onvif学习总结 2 wsl编译安装gSoap 1 前言 2 gSoap编译安装 wsl环境编译安装 3 最后 1 前言 结合官网安装教程
  • Go语言实现Onvif服务端:1、提供网络发现服务

    Go语言实现Onvif服务端 1 提供网络发现服务 文章目录 Go语言实现Onvif服务端 1 提供网络发现服务 1 前言 2 代码 3 结果 1 前言 该功能我们之前学习Onvif协议和WS Discovery时已经有了一定的基础了 接下
  • Go语言实现Onvif客户端:6、获取rtsp流地址

    Go语言实现Onvif客户端 6 获取rtsp流地址 文章目录 Go语言实现Onvif客户端 6 获取rtsp流地址 1 代码 2 结果 3 查看 1 代码 获取并选择Profile token后获取rtsp流地址也是调用接口即可 Desc
  • Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习 14 球机云台控制PTZ 文章目录 Onvif协议学习 14 球机云台控制PTZ 一 介绍 二 代码实现 八个方向 放下及缩小控制 聚焦控制 原文链接 https blog csdn net u013566528 art
  • Go语言实现Onvif客户端:2、获取设备信息

    Go语言实现Onvif客户端 2 获取设备信息 文章目录 Go语言实现Onvif客户端 2 获取设备信息 1 思路 2 代码 1 思路 搜索设备 获取设备能力 通过设备能力的设备接口读取设备信息 我们上节说了 主要是通过设备信息中的内容来区
  • ONVIF #PasswordDigest 的公式是什么

    我正在研究发送 GetDeviceInformation 的 ONVIF 这是必需的 wsse UsernameToken 经过查资料权威 有两个公式 1 通过 ONVIF Core Specification v241 pdf 5 12
  • C# 中的 Onvif 事件订阅

    我正在用 C 实现 ipCamera 编码器管理系统 该系统将管理来自多个供应商的多个 ipCamera 和 或编码器 使用 Onvif 代替每个 ipcamera 或编码器 sdk 将是一个好处 管理系统的关键概念之一是监听来自摄像机的事
  • 无法使用 C# 连接到启用 OnVif 的相机

    我是第一次使用 IPCam 并尝试连接到 OnVif 摄像机 我查看了各种论坛和堆栈溢出 并提出了以下代码 我知道该代码没有做任何有用的事情 但它现在只是一个概念证明 它找到我网络上的所有 4 个摄像头 然后我手动连接到其中一个摄像头以拉回
  • ONVIF 获取系统日期和时间请求

    一旦我从 UDP 多播请求返回 239 255 255 250 的响应 我返回带有 XAddrs 的 ProbeMatchhttp 10 10 10 10 1234 onvif device service 我现在如何执行 GetSyste

随机推荐

  • 笔记总结备份

    目录 文章目录 目录 前言 版本控制 常用git 命令 操作系统 系统 机器数 时间管理 早期的 Linux 时间系统 中断 内存管理 内存分区 malloc申请一块内存的背后原理 RTOS 系统栈和协议栈 寄存器 磁盘调度算法 虚拟内存
  • python 把数据写到tet_Crawlab准备之python+scrapy环境搭建

    上篇 分布式爬虫管理平台Crawlab开发搭建 把爬虫的管理后台搭建起来了 捣鼓一番发现要真正爬取数据还有下不少的功夫 这篇看看怎么搭建python scrapy环境 0x01 安装Python3 下载python安装包 具体版本根据自己的
  • 关于矩形窗函数DFT和FFT的笔记

    一直想写这个程序 今日终于如尝所愿 非常开心 矩形窗函数的FT是个什么样子呢 1 先从理论上分析一下 如图所示 贼简单 我们在二维坐标系里只能画出信号的幅度谱 F w 那么矩形窗的幅度谱是啥形状呢 本科的时候快把Sa函数的图画烂了 这时 我
  • Lustre客户端挂载失败报错

    查看 var log messages日志 发现出现OST0001等待OST0002分配序列号的报错 Jul 26 01 36 20 mds001 kernel perf interrupt took too long 11438 gt 1
  • 即时通信工具简介

    即时通信工具 什么是即时通信 即时通信是基于网络的一种新兴应用 它最基本的特征就是信息的即时传递和用户的交互性 并可将音 视频通信 文件传输及网络聊天等业务集成为一体 为人们开辟了一种新型的沟通途径 简单地讲 即时通信是一种使人们能在网络上
  • UP9616Q自带识别功能降压QC3.0车载快充芯片方案

    UP9616Q是一个高效率降压转换器能够提供高达3 3A充电器输出电流接口和一个宽范围输入电压 输入电压可从8V至32V 可工作在CV 恒定输出电压 模式 或 CC 恒定输出电流 模式 并带有电流限制功能 UP9616具有恒定的输出QC高通
  • Hyperledger Fabric配置文件解析-configtx.yaml

    configtx yaml简介 transaction的英文缩写是TX 表示交易 configtx表示交易配置 所以和交易相关的配置 如应用通道 锚节点 Orderer服务等 都是在configtx yaml文件中配置的 它主要生成通道创世
  • 自学黑客【网络安全】,一般人我劝你还是算了吧

    一 前言 1 这是一条坚持的道路 三分钟的热情可以放弃往下看了 2 多练多想 不要离开了教程什么都不会了 最好看完教程自己独立完成技术方面的开发 3 有时多 google baidu 我们往往都遇不到好心的大神 谁会无聊天天给你做解答 4
  • U盘制作成启动盘后容量变小怎么恢复

    今天用雨林木风做U盘启动后发现原本29G的可用空间只有25G可用了 怎么格式化都没办法还原 最后百度过后才知道出现这一问题的主要原因是在制作启动u盘时 软件会占用u盘部分空间进行制作并将这些空间隐藏起来 所以导致u盘的容量变小 恢复的方式也
  • maven笔记:maven创建archetype时的package路径错乱问题

    在使用mvn archetype create from project创建代码工程模板时 代码模板的import位置会出现 package 有时候可能会出现 紊乱 情况 比如org apache log4j 会被替换成net pgia i
  • centos7安装redis

    文章目录 1 检查是否安装Redis依赖 2 解压并编译安装 3 设置开机启动 3 1配置文件中允许后台运行 3 2redis服务文件中修改 1 检查是否安装Redis依赖 Redis是基于C语言编写的 需要gcc依赖 检查gcc是否安装
  • 使用Fragment作为Item的ViewPager不更新问题.

    最近做一个项目 需要在内存里动态切换ViewPager里面的Fragment 但是无论是我创建ViewPager还是刷新Adapter 只要被展示过的Fragment就不刷新 蛋疼了一下午 终于研究出来鸟 我首先使用的是fragmentPa
  • C语言实现的贪吃蛇(无EasyX,详解)

    前言 或许厌倦了枯燥的做题 那就学学贪吃蛇 激发你的学习乐趣吧 你将进一步加深对结构体 单链表 函数 循环等基础的理解 希望对你有所帮助 纯C实现的贪吃蛇 前言 代码效果 视频 学习新函数 让你的代码变得 高大上 任意位置输出 重点注意事项
  • SaveRenderTextureToPNG保存贴图到本地

    将RenderTexture保存成一张png图片 public bool SaveRenderTextureToPNG RenderTexture rt string contents string pngName RenderTextur
  • Nginx-内存池

    系列文章目录 Nginx资源目录简介 第一章 Nginx学习入门之内存池分析 文章目录 系列文章目录 Ngxin内存池简介 一 nginx内存池结构体 二 使用步骤 1 Ngix 内存池原理 内存作用范围 总结 Ngxin内存池简介 Ngi
  • maven 教程

    Maven项目管理 Maven是什么 Maven是Apache下的项目管理工具 它由纯Java语言开发 可以帮助我们更方便的管理和构建Java项目 为什么要使用Maven jar包管理 从Maven中央仓库获取标准的规范的jar包以及相关依
  • 故障:fork failed:Resource Temporarily Unavailable解决方案

    故障 fork failed Resource Temporarily Unavailable解决方案 在一次crontab bkapp txt导入N多定时任务时候 该用户无法执行任何命令 再ssh连报fork failed Resourc
  • oVirt快速安装指南

    介绍 此文档是针对第一次安装使用oVirt的用户 带领你们逐步完成oVirt的安装 基本环境设置和安装虚拟机 css 系统需求 下面介绍的系统要求只适合典型的中小规模环境的安装 若是对于安装 系统规划和负载均衡有特殊要求的用户 也可使用下面
  • 如何看待中小企业实现数字化转型难的问题?_光点科技

    中小企业在今天的商业环境中扮演着至关重要的角色 它们为就业创造了大量机会 促进了创新 支持了经济增长 然而 中小企业在数字化转型方面面临着许多挑战 这些挑战使得实现数字化转型变得困难 资源限制 中小企业通常拥有有限的资金和人力资源 这使得数
  • Onvif协议学习:12、修改分辨率

    Onvif协议学习 12 修改分辨率 文章目录 Onvif协议学习 12 修改分辨率 1 原理简介 2 函数接口 3 编码流程 4 示例代码 原文链接 https blog csdn net benkaoya article details