当前位置: 首页 > news >正文

ffmpeg硬件编码

使用FFmpeg进行硬件编码可以显著提高视频编码的性能,尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件(如Intel QSV、NVIDIA NVENC、AMD AMF等)来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。

 

1. 硬件编码支持的检查

在开始之前,确保你的系统支持硬件编码。可以通过以下命令检查FFmpeg支持的硬件编码器:

ffmpeg -hwaccels

 然后检查可用的硬件编码器:

ffmpeg -encoders | grep h264

2. 硬件编码的基本流程

硬件编码的基本流程与软件编码类似,但需要额外设置硬件设备上下文和硬件帧上下文。以下是主要步骤:

  1. 初始化硬件设备上下文:指定硬件加速类型(如QSV、CUDA等)。

  2. 创建硬件帧上下文:配置硬件帧的格式、分辨率等。

  3. 查找硬件编码器:如h264_qsvh264_nvenc等。

  4. 配置编码器上下文:绑定硬件帧上下文,设置编码参数。

  5. 编码帧:将帧数据发送到编码器,接收编码后的数据包。

  6. 写入输出文件:将编码后的数据包写入文件。

 3. 示例代码(Intel QSV 硬件编码)

#include <iostream>
#include <chrono>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/hwcontext.h>
#include <libswscale/swscale.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#ifdef HAVE_NVENC
#include <libnvenc/nvenc.h>
#endif
#ifdef HAVE_QSV
#include <libx264/x264.h> // 注意:QSV的实际头文件可能与此不同,这只是一个示例
#endif
}
#include <iostream>
#include <stdexcept>
#include <thread>
#include <chrono>
// 记录当前时间,用于计算编码过程的总耗时
auto nows = std::chrono::steady_clock::now();// 输出文件名
const char* output_filename = "output.h264";
// 视频分辨率
const int width = 1920;
const int height = 1080;
// 帧率(30帧/秒)
const AVRational frame_rate = { 30, 1 };
// 硬件像素格式(Intel QSV)
const AVPixelFormat hw_pix_fmt = AV_PIX_FMT_QSV;
// 软件像素格式(NV12)
const AVPixelFormat sw_pix_fmt = AV_PIX_FMT_NV12;// FFmpeg 相关上下文和结构体
AVFormatContext* fmt_ctx = nullptr;  // 输出文件上下文
AVCodecContext* codec_ctx = nullptr; // 编码器上下文
AVFrame* hw_frame = nullptr;         // 硬件帧
AVFrame* sw_frame = nullptr;         // 软件帧
AVPacket* pkt = nullptr;             // 编码后的数据包
AVBufferRef* hw_device_ctx = nullptr; // 硬件设备上下文try {// 1. 初始化硬件设备上下文int ret = av_hwdevice_ctx_create(&hw_device_ctx, AV_HWDEVICE_TYPE_QSV, nullptr, nullptr, 0);if (ret < 0) {throw std::runtime_error("Failed to create hardware device context");}// 2. 创建硬件帧上下文AVBufferRef* hw_frames_ref = av_hwframe_ctx_alloc(hw_device_ctx);if (!hw_frames_ref) {throw std::runtime_error("Failed to create hardware frames context");}// 配置硬件帧上下文参数AVHWFramesContext* hw_frames_ctx = (AVHWFramesContext*)hw_frames_ref->data;hw_frames_ctx->format = AV_PIX_FMT_QSV;       // 硬件像素格式hw_frames_ctx->sw_format = AV_PIX_FMT_NV12;   // 软件像素格式hw_frames_ctx->width = width;                 // 视频宽度hw_frames_ctx->height = height;               // 视频高度hw_frames_ctx->initial_pool_size = 20;        // 初始帧池大小// 初始化硬件帧上下文ret = av_hwframe_ctx_init(hw_frames_ref);if (ret < 0) {throw std::runtime_error("Failed to initialize hardware frames context");}// 3. 查找编码器(使用 Intel QSV 的 H.264 编码器)const AVCodec* codec = avcodec_find_encoder_by_name("h264_qsv");if (!codec) {throw std::runtime_error("Codec h264_qsv not found");}// 4. 创建编码器上下文codec_ctx = avcodec_alloc_context3(codec);if (!codec_ctx) {throw std::runtime_error("Could not allocate video codec context");}// 配置编码器参数codec_ctx->hw_frames_ctx = av_buffer_ref(hw_frames_ref); // 绑定硬件帧上下文codec_ctx->width = width;                                // 视频宽度codec_ctx->height = height;                              // 视频高度codec_ctx->time_base = av_inv_q(frame_rate);             // 时间基(帧率的倒数)codec_ctx->framerate = frame_rate;                       // 帧率codec_ctx->pix_fmt = AV_PIX_FMT_QSV;                     // 像素格式codec_ctx->bit_rate = 4000000;                           // 码率(4 Mbps)codec_ctx->gop_size = 1;                                 // GOP 大小(关键帧间隔)// 打开编码器ret = avcodec_open2(codec_ctx, codec, nullptr);if (ret < 0) {throw std::runtime_error("Could not open codec");}// 5. 创建硬件帧hw_frame = av_frame_alloc();if (!hw_frame) {throw std::runtime_error("Could not allocate video frame");}hw_frame->format = AV_PIX_FMT_QSV; // 硬件像素格式hw_frame->width = width;           // 视频宽度hw_frame->height = height;         // 视频高度// 为硬件帧分配内存ret = av_hwframe_get_buffer(av_buffer_ref(hw_frames_ref), hw_frame, 0);if (ret < 0) {throw std::runtime_error("Could not allocate hardware frame buffer");}// 6. 创建软件帧sw_frame = av_frame_alloc();if (!sw_frame) {throw std::runtime_error("Could not allocate software frame");}sw_frame->format = AV_PIX_FMT_NV12; // 软件像素格式sw_frame->width = width;            // 视频宽度sw_frame->height = height;          // 视频高度// 为软件帧分配内存ret = av_frame_get_buffer(sw_frame, 0);if (ret < 0) {throw std::runtime_error("Could not allocate software frame buffer");}// 7. 创建输出文件上下文ret = avformat_alloc_output_context2(&fmt_ctx, nullptr, nullptr, output_filename);if (ret < 0) {throw std::runtime_error("Could not create output context");}// 8. 创建视频流AVStream* stream = avformat_new_stream(fmt_ctx, nullptr);if (!stream) {throw std::runtime_error("Could not create video stream");}// 从编码器上下文复制参数到视频流avcodec_parameters_from_context(stream->codecpar, codec_ctx);stream->time_base = AVRational{ 1, 90000 }; // 时间基// 9. 打开输出文件if (!(fmt_ctx->oformat->flags & AVFMT_NOFILE)) {ret = avio_open(&fmt_ctx->pb, output_filename, AVIO_FLAG_WRITE);if (ret < 0) {throw std::runtime_error("Could not open output file");}}// 10. 写入文件头ret = avformat_write_header(fmt_ctx, nullptr);if (ret < 0) {throw std::runtime_error("Error writing header to output file");}// 11. 编码帧FILE* f = fopen("asdhfladghakl.yuv", "rb"); // 打开 YUV 文件if (!f) {throw std::runtime_error("Could not open YUV file");}for (int i = 0; i < 50; i++) { // 编码 50 帧// 从 YUV 文件读取数据到软件帧fread(sw_frame->data[0], 1, width * height, f);      // Y 分量fread(sw_frame->data[1], 1, width * height / 2, f);  // UV 分量// 将软件帧数据拷贝到硬件帧ret = av_hwframe_transfer_data(hw_frame, sw_frame, 0);if (ret < 0) {throw std::runtime_error("Error transferring data to hardware frame");}// 设置帧的显示时间戳(PTS)hw_frame->pts = i * 3000; // PTS = 帧序号 * 帧间隔hw_frame->time_base = AVRational{ 1, 90000 }; // 时间基// 发送帧到编码器ret = avcodec_send_frame(codec_ctx, hw_frame);if (ret < 0) {throw std::runtime_error("Error sending frame to encoder");}// 接收编码后的数据包pkt = av_packet_alloc();while (ret >= 0) {ret = avcodec_receive_packet(codec_ctx, pkt);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {av_packet_free(&pkt);break;}// 设置数据包的流索引和时间基pkt->stream_index = stream->index;pkt->time_base = AVRational{ 1, 90000 };// 写入数据包到输出文件ret = av_interleaved_write_frame(fmt_ctx, pkt);if (ret < 0) {throw std::runtime_error("Error writing packet to file");}// 释放数据包av_packet_unref(pkt);}}// 12. 刷新编码器(发送空帧以刷新缓冲区)ret = avcodec_send_frame(codec_ctx, nullptr);while (ret >= 0) {pkt = av_packet_alloc();ret = avcodec_receive_packet(codec_ctx, pkt);if (ret == AVERROR_EOF) {break;}// 写入剩余的数据包到输出文件pkt->stream_index = stream->index;pkt->time_base = AVRational{ 1, 90000 };ret = av_interleaved_write_frame(fmt_ctx, pkt);av_packet_unref(pkt);}// 13. 写入文件尾av_write_trailer(fmt_ctx);// 关闭 YUV 文件fclose(f);std::cout << "Encoding completed successfully!" << std::endl;
}
catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;
}// 计算并输出编码过程的总耗时
std::cout << "Total time taken: "<< std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - nows).count()<< " milliseconds" << std::endl;// 14. 释放资源
if (fmt_ctx && !(fmt_ctx->oformat->flags & AVFMT_NOFILE)) {avio_closep(&fmt_ctx->pb);
}
avformat_free_context(fmt_ctx);
av_frame_free(&hw_frame);
av_frame_free(&sw_frame);
av_packet_free(&pkt);
avcodec_free_context(&codec_ctx);
av_buffer_unref(&hw_device_ctx);

代码总结

  1. 硬件初始化:初始化 Intel QSV 硬件设备上下文和硬件帧上下文。

  2. 编码器设置:查找并配置 H.264 编码器,绑定硬件帧上下文。

  3. 帧处理:从 YUV 文件读取数据,拷贝到硬件帧,编码并写入输出文件。

  4. 资源释放:释放所有分配的资源,避免内存泄漏。

  5. 性能统计:计算并输出编码过程的总耗时。

 

可以看见运行编码得到明显提升 

相关文章:

ffmpeg硬件编码

使用FFmpeg进行硬件编码可以显著提高视频编码的性能&#xff0c;尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件&#xff08;如Intel QSV、NVIDIA NVENC、AMD AMF等&#xff09;来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。 1. 硬件编码支…...

脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)

文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载&#xff08;离线&#xff09;2.yum脚本化安装&#xff08;离线&#xff09;3.nfs脚本化安装&#xff08;离线&#xff09;4.pg数据库脚本化安装&#xff08;离线&#xff09;5.nginx脚本化安装&#xff08;离…...

// Error: line 1: XGen: Candidate guides have not been associated!

Maya xgen 报错// Error: line 1: XGen: Candidate guides have not been associated! 复制下面粘贴到Maya脚本管理器python运行&#xff1a; import maya.cmds as cmds def connect_xgen_guides():guide_nodes cmds.ls(typexgmMakeGuide)for node in guide_nodes:downstream…...

投机解码论文阅读:Falcon

题目&#xff1a;Falcon: Faster and Parallel Inference of Large Language Models through Enhanced Semi-Autoregressive Drafting and Custom-Designed Decoding Tree 地址&#xff1a;https://arxiv.org/pdf/2412.12639 一看它的架构图&#xff0c;可以发现它是基于EAGLE…...

OpenCV实现基于交叉双边滤波的红外可见光融合算法

1 算法原理 CBF是*Cross Bilateral Filter(交叉双边滤波)*的缩写&#xff0c;论文《IMAGE FUSION BASED ON PIXEL SIGNIFICANCE USING CROSS BILATERAL FILTER》。 论文中&#xff0c;作者使用交叉双边滤波算法对原始图像 A A A&#xff0c; B B B 进行处理得到细节&#xff0…...

Springboot整合WebService

1.1 概述 webservice 即 web 服务&#xff0c;因互联网而产生&#xff0c;通过 webservice 这种 web 服务&#xff0c;我们可以实现互联网应 用之间的资源共享&#xff0c;比如我们想知道 手机号码归属地&#xff0c;列车时刻表&#xff0c;天气预报&#xff0c;省市区邮…...

504 Gateway Timeout:网关超时解决方法

一、什么是 504Gateway Timeout&#xff1f; 1. 错误定义 504 Gateway Timeout 是 HTTP 状态码的一种&#xff0c;表示网关或代理服务器在等待上游服务器响应时超时。通俗来说&#xff0c;这是服务器之间“对话失败”导致的。 2. 常见触发场景 Nginx 超时&#xff1a;反向代…...

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…...

抢十八游戏

前言 我国民国一直流传着一个名叫“抢十八”的抢数游戏&#xff1a;参与游戏的两人从1开始轮流报数&#xff0c;每次至少报1个数&#xff0c;最多报2个数&#xff0c;每人报的每个数不得与自已报过的或对方报过的重复&#xff0c;也不得跳过任何一个数。谁先报到18&#xff0c…...

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…...

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…...

学习threejs,使用FlyControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.FlyControls 相机控制…...

wordpress 房产网站筛选功能

自定义分类法创建 add_action( init, ashu_post_type ); function ashu_post_type() {register_taxonomy(province,post,array(label => 省,rewrite => array( slug => province ),hierarchical => true));register_taxonomy(city,post,array(label => 市,rewr…...

SQL面试题2:留存率问题

引言 场景介绍&#xff1a; 在互联网产品运营中&#xff0c;用户注册量和留存率是衡量产品吸引力和用户粘性的关键指标&#xff0c;直接影响产品的可持续发展和商业价值。通过分析这些数据&#xff0c;企业可以了解用户行为&#xff0c;优化产品策略&#xff0c;提升用户体验…...

Redis是单线程还是多线程?

大家好&#xff0c;我是锋哥。今天分享关于【Redis是单线程还是多线程&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis是单线程还是多线程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis是 单线程 的。 尽管Redis的处理是单线程的&a…...

mysql 变量,流程控制与游标

第16章_变量,流程控制与游标 1.变量 分为系统变量和用户自定义变量 1.1系统变量 1.1.1系统变量分类 系统变量分为全局系统变量以及会话系统变量 查看所有全局变量 SHOW GLOBAL VARIABLES 查看所有会话变量 SHOW SESSION VARIABLESor SHOW VARIABLES #默认是会话变量 …...

Java配置log4j日志打印

1. 引入依赖 <dependencies><!-- Log4j 2依赖 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>1.2.14</version> <!-- 可以根据需要修改版本 --></…...

什么是SQL?

什么是SQL&#xff1f; SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于与关系型数据库进行交互的标准编程语言。SQL 是设计用于管理和操作关系型数据库的语言&#xff0c;主要用于查询、插入、更新、删除和定义数据结构。SQL 是关…...

Linux 机器学习

Linux 机器学习是指在 Linux 操作系统环境下进行机器学习相关的开发、训练和应用。 具体步骤 环境搭建&#xff1a; 选择合适的 Linux 发行版&#xff1a;如 Ubuntu、Fedora、Arch Linux 等。Ubuntu 因其易用性和丰富的软件包管理系统&#xff0c;适合初学者&#xff1b;Fed…...

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载,Scroll滚动到顶部

HarmonyOS 鸿蒙 ArkTs(5.0.1 13)实现Scroll下拉到顶刷新/上拉触底加载 效果展示 使用方法 import LoadingText from "../components/LoadingText" import PageToRefresh from "../components/PageToRefresh" import FooterBar from "../components/…...

第27章 汇编语言--- 设备驱动开发基础

汇编语言是低级编程语言的一种&#xff0c;它与特定的计算机架构紧密相关。在设备驱动开发中&#xff0c;汇编语言有时用于编写性能关键的部分或直接操作硬件&#xff0c;因为它是接近机器语言的代码&#xff0c;可以提供对硬件寄存器和指令集的直接访问。 要展开源代码详细叙…...

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…...

【git】-初始git

学习资源推荐- 标签管理 - Git教程 - 廖雪峰的官方网站 一、什么是版本控制&#xff1f; 二、Git的安装 三、掌握Linux常用命令 四、Git基本操作 1、提交代码 2、查看历史提交 3、版本回退 一、什么是版本控制&#xff1f; 版本控制是一种用于记录文件或项目内容变化的系…...

JAVA之单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在软件设计中&#xff0c;单例模式常用于控制对资源的访问&#xff0c;例如数据库连接、线程池等。以下是单例模式的详…...

无人机数据集,支持YOLO,COCO json,PASICAL VOC xml格式的标注,正确识别率可达到95.7%,10000张原始图片

无人机数据集&#xff0c;支持YOLO&#xff0c;COCO json&#xff0c;PASICAL VOC xml格式的标注&#xff0c;正确识别率可达到95.7%&#xff0c;10000张原始图片 下载地址&#xff1a; 标注好的数据集下载地址&#xff1a; yolo v11: https://download.csdn.net/download/p…...

Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)

目录 1. Linux中的进程状态 1.1 前台进程和后台进程 运行状态 睡眠状态 磁盘休眠状态 停止状态 kill指令—向进程发送信号 死亡状态 2. 僵尸进程 2.1 僵尸状态 2.2 僵尸进程 2.3 僵尸进程危害 3. 孤儿进程 4. 进程的优先级 概念 查看进程优先级 PRI&#xff08…...

stack和queue专题

文章目录 stack最小栈题目解析代码 栈的压入弹出序列题目解析代码 queue二叉树的层序遍历题目解析代码 stack stack和queue都是空间适配器 最小栈 最小栈的题目链接 题目解析 minst是空就进栈&#xff0c;或者是val < minst.top()就进栈 代码 class MinStack { public:M…...

一 rk3568 Android 11固件开发环境搭建 (docker)

一 目标 搭建 rk3568 android 系统内核 及固件开发编译调试环境, 支持开发环境导出分享 基于荣品 rk3568 核心板 系统环境: ubuntu22.04 /ubuntu20.04 64位桌面版 编译环境: docker + ubuntu20.04 , 独立的容器隔离环境,不受系统库版本冲突等影响,无性能损耗, 可…...

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读&#xff0c;全文使用中文进行描述&#xff0c;最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作&#xff0c;可自行将自己的结果发给ai&#xff0c…...

三小时深度学习PyTorch

【对新手非常友好】三小时深度学习PyTorch快速入门&#xff01;包教会你的&#xff01; --人工智能/深度学习/pytorch_哔哩哔哩_bilibili从头开始&#xff0c;把概率论、统计、信息论中零散的知识统一起来_哔哩哔哩_bilibili从编解码和词嵌入开始&#xff0c;一步一步理解Trans…...

朴素贝叶斯分类器

一、生成模型&#xff08;学习&#xff09;&#xff08;Generative Model&#xff09; vs 判别模型&#xff08;学习&#xff09;&#xff08;Discriminative Model&#xff09; 结论&#xff1a;贝叶斯分类器是生成模型 1、官方说明 生成模型对联合概率 p(x, y)建模&#x…...

商用车电子电气零部件电磁兼容条件和试验(2)—术语和定义

写在前面 本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求&#xff0c;高压试验项目内容及要求。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 目录 商用车电子电气…...

SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码

导言 如上图所示&#xff0c;进入SimpleFOC官网&#xff0c;点击Github下载源代码。 如上图所示&#xff0c;找到仓库。 comom代码的移植后&#xff0c;simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分&#xff0c;其中communication是跟simpleFOC上位机通讯&a…...

物联网之传感器技术

引言 在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动各行各业变革的重要力量。而物联网传感器&#xff0c;作为物联网感知层的核心技术&#xff0c;更是扮演着不可或缺的角色。它们如同人类的五官&#xff0c;能够感知物理世界中的各种信…...

React:构建用户界面的JavaScript库

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

基于TypeScript封装 `axios` 请求工具详解

TypeScript 项目中&#xff0c;封装一个详细的 axios 请求工具可以提高代码的可维护性、可重用性&#xff0c;并让请求逻辑与业务逻辑分离。以下是一个详细的封装示例&#xff0c;包括请求拦截器、响应拦截器、错误处理、以及类型定义。 1. 安装 Axios 首先&#xff0c;确保你…...

ElasticSearch在Windows环境搭建测试

引子 也持续关注大数据相关内容一段时间&#xff0c;大数据内容很多。想了下还是从目前项目需求侧出发&#xff0c;进行相关学习。Elasticsearch&#xff08;ES&#xff09;是位于 Elastic Stack&#xff08;ELK stack&#xff09; 核心的分布式搜索和分析引擎。Logstash 和 B…...

通信与网络安全管理之ISO七层模型与TCP/IP模型

一.ISO参考模型 OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI&#xff09;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型&#xff0c;为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是…...

高级运维:shell练习2

1、需求&#xff1a;判断192.168.1.0/24网络中&#xff0c;当前在线的ip有哪些&#xff0c;并编写脚本打印出来。 vim check.sh #!/bin/bash# 定义网络前缀 network_prefix"192.168.1"# 循环遍历1-254的IP for i in {1..254}; do# 构造完整的IP地址ip"$network_…...

三相无刷电机控制|FOC理论04 - 克拉克变换 + 帕克变换的最终目标

导言 通过坐标系旋转&#xff0c;将电机中复杂的三相交流信号映射到与转子磁场同步的旋转参考系中&#xff0c;将动态问题转化为静态问题。这种方法的优点在于&#xff1a; 简化了控制逻辑。实现了转矩Iq和磁通Id的解耦。提供了直流量控制的可能性&#xff0c;大大提高了控制效…...

SAP FICO资产模块各元素基本关系总结

文章目录 【SAP系统研究】 #SAP #FICO #资产会计 ①&#xff1a;每个折旧表包含多个折旧范围&#xff0c;折旧范围用于设置资产的平行折旧&#xff0c;如不同的折旧范围可以更新不同的总账&#xff0c;更新不同的科目等。 ②&#xff1a;折旧表是要分配给公司代码的&#xff…...

Elasticsearch快速入门

Elasticsearch是由elastic公司开发的一套搜索引擎技术&#xff0c;它是elastic技术栈中的一部分,提供核心的数据存储、搜索、分析功能 elasticsearch之所以有如此高性能的搜索表现&#xff0c;正是得益于底层的倒排索引技术。那么什么是倒排索引呢&#xff1f; Elasticsearch…...

【Java数据结构】二叉树相关算法

第一题&#xff1a;获取二叉树中结点个数 得到二叉树结点个数&#xff0c;如果结点为空则返回0&#xff0c;然后再用递归计算左树结点个数根结点&#xff08;1个&#xff09;右树结点个数。 public int nodeSize(Node root){if (root null)return 0;return nodeSize1(root.l…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <1> 5分钟快速创建一个springboot web项目

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…...

vue3学习日记6 - Layout

最近发现职场前端用的框架大多为vue&#xff0c;所以最近也跟着黑马程序员vue3的课程进行学习&#xff0c;以下是我的学习记录 视频网址&#xff1a; Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记&#xff1a; vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...

1/14 C++

练习&#xff1a;将图形类的获取周长和获取面积函数设置成虚函数&#xff0c;完成多态 再定义一个全局函数&#xff0c;能够在该函数中实现&#xff1a;无论传递任何图形&#xff0c;都可以输出传递的图形的周长和面积 #include <iostream>using namespace std; class Sh…...

【Uniapp-Vue3】页面生命周期onLoad和onReady

一、onLoad函数 onLoad在页面载入时触发&#xff0c;多用于页面跳转时进行参数传递。 我们在跳转的时候传递参数name和age: 接受参数&#xff1a; import {onLoad} from "dcloudio/uni-app"; onLoad((e)>{...}) 二、onReady函数 页面生命周期函数中的onReady其…...

使用 configparser 读取 INI 配置文件

使用 configparser 读取 INI 配置文件 适合于读取 .ini 格式的配置文件。 配置文件示例 (config.ini): [DEFAULT] host localhost port 3306 [database] user admin password secret import configparser# 创建配置解析器 config configparser.ConfigParser()# 读取配…...

类模板的使用方法

目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件&#xff1a; 8.类模板与友元 9.类模板案例 MyArray.hpp …...

docker mysql5.7如何设置不区分大小写

环境 docker部署&#xff0c;镜像是5.7&#xff0c;操作系统是centos 操作方式 mysql 配置文件是放在 /etc/mysql/mysql.conf.d/mysqld.cnf&#xff0c; vim /etc/mysql/mysql.conf.d/mysqld.cnf lower_case_table_names1 重启mysql容器 验证 SHOW VARIABLES LIKE low…...