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

FFmpeg之HWContextType

HWContextType算是ffmpeg中为硬解码第三方接口的一个辅助类,它自己有两个辅助子类
AVHWDeviceContext和AVHWFramesContext。
AVHWDeviceContext主要表示硬件上下文
AVHWFramesContext主要表示硬件Frame的一些参数,比如你解码后的YUV数据还在硬件上,那么就通过这个类去存储相关参数。

那么它辅助硬解码器做什么呢?我们还是通过英伟达的例子来看

const HWContextType ff_hwcontext_type_cuda = {.type                 = AV_HWDEVICE_TYPE_CUDA,.name                 = "CUDA",.device_hwctx_size    = sizeof(AVCUDADeviceContext),.frames_priv_size     = sizeof(CUDAFramesContext),.device_create        = cuda_device_create,.device_derive        = cuda_device_derive,.device_init          = cuda_device_init,.device_uninit        = cuda_device_uninit,.frames_get_constraints = cuda_frames_get_constraints,.frames_init          = cuda_frames_init,.frames_get_buffer    = cuda_get_buffer,.transfer_get_formats = cuda_transfer_get_formats,.transfer_data_to     = cuda_transfer_data,.transfer_data_from   = cuda_transfer_data,.pix_fmts             = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, AV_PIX_FMT_NONE },
};

仔细看上面函数就发现,全部是device mem操作,大白话说就是ffmpeg通过这套机制来实现D2H或者H2D的操作,别无其它。

具体看看结构体定义吧,一大堆函数指针,这些就是你要实现的,不一定全部要实现,实现你自己想要的就可以了,主要的有transfer_data_to/transfer_data_from,map_to/map_from。


typedef struct HWContextType {enum AVHWDeviceType type;const char         *name;/*** An array of pixel formats supported by the AVHWFramesContext instances* Terminated by AV_PIX_FMT_NONE.*/const enum AVPixelFormat *pix_fmts;/*** size of the public hardware-specific context,* i.e. AVHWDeviceContext.hwctx*/size_t             device_hwctx_size;/*** size of the private data, i.e.* AVHWDeviceInternal.priv*/size_t             device_priv_size;/*** Size of the hardware-specific device configuration.* (Used to query hwframe constraints.)*/size_t             device_hwconfig_size;/*** size of the public frame pool hardware-specific context,* i.e. AVHWFramesContext.hwctx*/size_t             frames_hwctx_size;/*** size of the private data, i.e.* AVHWFramesInternal.priv*/size_t             frames_priv_size;int              (*device_create)(AVHWDeviceContext *ctx, const char *device,AVDictionary *opts, int flags);int              (*device_derive)(AVHWDeviceContext *dst_ctx,AVHWDeviceContext *src_ctx,AVDictionary *opts, int flags);int              (*device_init)(AVHWDeviceContext *ctx);void             (*device_uninit)(AVHWDeviceContext *ctx);int              (*frames_get_constraints)(AVHWDeviceContext *ctx,const void *hwconfig,AVHWFramesConstraints *constraints);int              (*frames_init)(AVHWFramesContext *ctx);void             (*frames_uninit)(AVHWFramesContext *ctx);int              (*frames_get_buffer)(AVHWFramesContext *ctx, AVFrame *frame);int              (*transfer_get_formats)(AVHWFramesContext *ctx,enum AVHWFrameTransferDirection dir,enum AVPixelFormat **formats);int              (*transfer_data_to)(AVHWFramesContext *ctx, AVFrame *dst,const AVFrame *src);int              (*transfer_data_from)(AVHWFramesContext *ctx, AVFrame *dst,const AVFrame *src);int              (*map_to)(AVHWFramesContext *ctx, AVFrame *dst,const AVFrame *src, int flags);int              (*map_from)(AVHWFramesContext *ctx, AVFrame *dst,const AVFrame *src, int flags);int              (*frames_derive_to)(AVHWFramesContext *dst_ctx,AVHWFramesContext *src_ctx, int flags);int              (*frames_derive_from)(AVHWFramesContext *dst_ctx,AVHWFramesContext *src_ctx, int flags);
} HWContextType;

AVHWFramesContext结构体表示


/*** This struct describes a set or pool of "hardware" frames (i.e. those with* data not located in normal system memory). All the frames in the pool are* assumed to be allocated in the same way and interchangeable.** This struct is reference-counted with the AVBuffer mechanism and tied to a* given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor* yields a reference, whose data field points to the actual AVHWFramesContext* struct.*/
typedef struct AVHWFramesContext {/*** A class for logging.*/const AVClass *av_class;/*** Private data used internally by libavutil. Must not be accessed in any* way by the caller.*/AVHWFramesInternal *internal;/*** A reference to the parent AVHWDeviceContext. This reference is owned and* managed by the enclosing AVHWFramesContext, but the caller may derive* additional references from it.*/AVBufferRef *device_ref;/*** The parent AVHWDeviceContext. This is simply a pointer to* device_ref->data provided for convenience.** Set by libavutil in av_hwframe_ctx_init().*/AVHWDeviceContext *device_ctx;/*** The format-specific data, allocated and freed automatically along with* this context.** Should be cast by the user to the format-specific context defined in the* corresponding header (hwframe_*.h) and filled as described in the* documentation before calling av_hwframe_ctx_init().** After any frames using this context are created, the contents of this* struct should not be modified by the caller.*/void *hwctx;/*** This field may be set by the caller before calling av_hwframe_ctx_init().** If non-NULL, this callback will be called when the last reference to* this context is unreferenced, immediately before it is freed.*/void (*free)(struct AVHWFramesContext *ctx);/*** Arbitrary user data, to be used e.g. by the free() callback.*/void *user_opaque;/*** A pool from which the frames are allocated by av_hwframe_get_buffer().* This field may be set by the caller before calling av_hwframe_ctx_init().* The buffers returned by calling av_buffer_pool_get() on this pool must* have the properties described in the documentation in the corresponding hw* type's header (hwcontext_*.h). The pool will be freed strictly before* this struct's free() callback is invoked.** This field may be NULL, then libavutil will attempt to allocate a pool* internally. Note that certain device types enforce pools allocated at* fixed size (frame count), which cannot be extended dynamically. In such a* case, initial_pool_size must be set appropriately.*/AVBufferPool *pool;/*** Initial size of the frame pool. If a device type does not support* dynamically resizing the pool, then this is also the maximum pool size.** May be set by the caller before calling av_hwframe_ctx_init(). Must be* set if pool is NULL and the device type does not support dynamic pools.*/int initial_pool_size;/*** The pixel format identifying the underlying HW surface type.** Must be a hwaccel format, i.e. the corresponding descriptor must have the* AV_PIX_FMT_FLAG_HWACCEL flag set.** Must be set by the user before calling av_hwframe_ctx_init().*/enum AVPixelFormat format;/*** The pixel format identifying the actual data layout of the hardware* frames.** Must be set by the caller before calling av_hwframe_ctx_init().** @note when the underlying API does not provide the exact data layout, but* only the colorspace/bit depth, this field should be set to the fully* planar version of that format (e.g. for 8-bit 420 YUV it should be* AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else).*/enum AVPixelFormat sw_format;/*** The allocated dimensions of the frames in this pool.** Must be set by the user before calling av_hwframe_ctx_init().*/int width, height;
} AVHWFramesContext;

AVHWDeviceContext的结构体表示,硬件的抽象


/*** This struct aggregates all the (hardware/vendor-specific) "high-level" state,* i.e. state that is not tied to a concrete processing configuration.* E.g., in an API that supports hardware-accelerated encoding and decoding,* this struct will (if possible) wrap the state that is common to both encoding* and decoding and from which specific instances of encoders or decoders can be* derived.** This struct is reference-counted with the AVBuffer mechanism. The* av_hwdevice_ctx_alloc() constructor yields a reference, whose data field* points to the actual AVHWDeviceContext. Further objects derived from* AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with* specific properties) will hold an internal reference to it. After all the* references are released, the AVHWDeviceContext itself will be freed,* optionally invoking a user-specified callback for uninitializing the hardware* state.*/
typedef struct AVHWDeviceContext {/*** A class for logging. Set by av_hwdevice_ctx_alloc().*/const AVClass *av_class;/*** Private data used internally by libavutil. Must not be accessed in any* way by the caller.*/AVHWDeviceInternal *internal;/*** This field identifies the underlying API used for hardware access.** This field is set when this struct is allocated and never changed* afterwards.*/enum AVHWDeviceType type;/*** The format-specific data, allocated and freed by libavutil along with* this context.** Should be cast by the user to the format-specific context defined in the* corresponding header (hwcontext_*.h) and filled as described in the* documentation before calling av_hwdevice_ctx_init().** After calling av_hwdevice_ctx_init() this struct should not be modified* by the caller.*/void *hwctx;/*** This field may be set by the caller before calling av_hwdevice_ctx_init().** If non-NULL, this callback will be called when the last reference to* this context is unreferenced, immediately before it is freed.** @note when other objects (e.g an AVHWFramesContext) are derived from this*       struct, this callback will be invoked after all such child objects*       are fully uninitialized and their respective destructors invoked.*/void (*free)(struct AVHWDeviceContext *ctx);/*** Arbitrary user data, to be used e.g. by the free() callback.*/void *user_opaque;
} AVHWDeviceContext;

常用函数

这些函数其实挺重要的,因为都是用户函数,通过这些函数去从解码器硬件上获取到你要的数据,比如av_hwframe_transfer_data/av_hwframe_get_buffer,就是说你在ffmpeg中不要显示的调用你自己的cuMemD2H或者H2D的函数,ffmpeg已经给你预留好了接口了,用这些接口去获取更加简单。


/*** Look up an AVHWDeviceType by name.** @param name String name of the device type (case-insensitive).* @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if*         not found.*/
enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name);/** Get the string name of an AVHWDeviceType.** @param type Type from enum AVHWDeviceType.* @return Pointer to a static string containing the name, or NULL if the type*         is not valid.*/
const char *av_hwdevice_get_type_name(enum AVHWDeviceType type);/*** Iterate over supported device types.** @param type AV_HWDEVICE_TYPE_NONE initially, then the previous type*             returned by this function in subsequent iterations.* @return The next usable device type from enum AVHWDeviceType, or*         AV_HWDEVICE_TYPE_NONE if there are no more.*/
enum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev);/*** Allocate an AVHWDeviceContext for a given hardware type.** @param type the type of the hardware device to allocate.* @return a reference to the newly created AVHWDeviceContext on success or NULL*         on failure.*/
AVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type);/*** Finalize the device context before use. This function must be called after* the context is filled with all the required information and before it is* used in any way.** @param ref a reference to the AVHWDeviceContext* @return 0 on success, a negative AVERROR code on failure*/
int av_hwdevice_ctx_init(AVBufferRef *ref);/*** Open a device of the specified type and create an AVHWDeviceContext for it.** This is a convenience function intended to cover the simple cases. Callers* who need to fine-tune device creation/management should open the device* manually and then wrap it in an AVHWDeviceContext using* av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init().** The returned context is already initialized and ready for use, the caller* should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of* the created AVHWDeviceContext are set by this function and should not be* touched by the caller.** @param device_ctx On success, a reference to the newly-created device context*                   will be written here. The reference is owned by the caller*                   and must be released with av_buffer_unref() when no longer*                   needed. On failure, NULL will be written to this pointer.* @param type The type of the device to create.* @param device A type-specific string identifying the device to open.* @param opts A dictionary of additional (type-specific) options to use in*             opening the device. The dictionary remains owned by the caller.* @param flags currently unused** @return 0 on success, a negative AVERROR code on failure.*/
int av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type,const char *device, AVDictionary *opts, int flags);/*** Create a new device of the specified type from an existing device.** If the source device is a device of the target type or was originally* derived from such a device (possibly through one or more intermediate* devices of other types), then this will return a reference to the* existing device of the same type as is requested.** Otherwise, it will attempt to derive a new device from the given source* device.  If direct derivation to the new type is not implemented, it will* attempt the same derivation from each ancestor of the source device in* turn looking for an implemented derivation method.** @param dst_ctx On success, a reference to the newly-created*                AVHWDeviceContext.* @param type    The type of the new device to create.* @param src_ctx A reference to an existing AVHWDeviceContext which will be*                used to create the new device.* @param flags   Currently unused; should be set to zero.* @return        Zero on success, a negative AVERROR code on failure.*/
int av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx,enum AVHWDeviceType type,AVBufferRef *src_ctx, int flags);/*** Create a new device of the specified type from an existing device.** This function performs the same action as av_hwdevice_ctx_create_derived,* however, it is able to set options for the new device to be derived.** @param dst_ctx On success, a reference to the newly-created*                AVHWDeviceContext.* @param type    The type of the new device to create.* @param src_ctx A reference to an existing AVHWDeviceContext which will be*                used to create the new device.* @param options Options for the new device to create, same format as in*                av_hwdevice_ctx_create.* @param flags   Currently unused; should be set to zero.* @return        Zero on success, a negative AVERROR code on failure.*/
int av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ctx,enum AVHWDeviceType type,AVBufferRef *src_ctx,AVDictionary *options, int flags);/*** Allocate an AVHWFramesContext tied to a given device context.** @param device_ctx a reference to a AVHWDeviceContext. This function will make*                   a new reference for internal use, the one passed to the*                   function remains owned by the caller.* @return a reference to the newly created AVHWFramesContext on success or NULL*         on failure.*/
AVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx);/*** Finalize the context before use. This function must be called after the* context is filled with all the required information and before it is attached* to any frames.** @param ref a reference to the AVHWFramesContext* @return 0 on success, a negative AVERROR code on failure*/
int av_hwframe_ctx_init(AVBufferRef *ref);/*** Allocate a new frame attached to the given AVHWFramesContext.** @param hwframe_ctx a reference to an AVHWFramesContext* @param frame an empty (freshly allocated or unreffed) frame to be filled with*              newly allocated buffers.* @param flags currently unused, should be set to zero* @return 0 on success, a negative AVERROR code on failure*/
int av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags);/*** Copy data to or from a hw surface. At least one of dst/src must have an* AVHWFramesContext attached.** If src has an AVHWFramesContext attached, then the format of dst (if set)* must use one of the formats returned by av_hwframe_transfer_get_formats(src,* AV_HWFRAME_TRANSFER_DIRECTION_FROM).* If dst has an AVHWFramesContext attached, then the format of src must use one* of the formats returned by av_hwframe_transfer_get_formats(dst,* AV_HWFRAME_TRANSFER_DIRECTION_TO)** dst may be "clean" (i.e. with data/buf pointers unset), in which case the* data buffers will be allocated by this function using av_frame_get_buffer().* If dst->format is set, then this format will be used, otherwise (when* dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen.** The two frames must have matching allocated dimensions (i.e. equal to* AVHWFramesContext.width/height), since not all device types support* transferring a sub-rectangle of the whole surface. The display dimensions* (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but* also have to be equal for both frames. When the display dimensions are* smaller than the allocated dimensions, the content of the padding in the* destination frame is unspecified.** @param dst the destination frame. dst is not touched on failure.* @param src the source frame.* @param flags currently unused, should be set to zero* @return 0 on success, a negative AVERROR error code on failure.*/
int av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags);enum AVHWFrameTransferDirection {/*** Transfer the data from the queried hw frame.*/AV_HWFRAME_TRANSFER_DIRECTION_FROM,/*** Transfer the data to the queried hw frame.*/AV_HWFRAME_TRANSFER_DIRECTION_TO,
};/*** Get a list of possible source or target formats usable in* av_hwframe_transfer_data().** @param hwframe_ctx the frame context to obtain the information for* @param dir the direction of the transfer* @param formats the pointer to the output format list will be written here.*                The list is terminated with AV_PIX_FMT_NONE and must be freed*                by the caller when no longer needed using av_free().*                If this function returns successfully, the format list will*                have at least one item (not counting the terminator).*                On failure, the contents of this pointer are unspecified.* @param flags currently unused, should be set to zero* @return 0 on success, a negative AVERROR code on failure.*/
int av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx,enum AVHWFrameTransferDirection dir,enum AVPixelFormat **formats, int flags);

相关文章:

FFmpeg之HWContextType

HWContextType算是ffmpeg中为硬解码第三方接口的一个辅助类,它自己有两个辅助子类 AVHWDeviceContext和AVHWFramesContext。 AVHWDeviceContext主要表示硬件上下文 AVHWFramesContext主要表示硬件Frame的一些参数,比如你解码后的YUV数据还在硬件上&#…...

Python面向对象之类和对象(Python系列16)

前言:面向对象是什么,为什么要学面向对象?面向对象是一种思想,让我们的程序变得更加的贴切我们的生活,更加的形象,让代码的可读性和扩展性变得更高。 面向对象:可以使用类将变量和函数组成新的…...

电商对传统零售业的影响:销售渠道、价格竞争与服务质量挑战

随着互联网的普及和电商行业的飞速发展,传统零售业面临着前所未有的挑战。电商不仅改变了消费者的购物方式和消费习惯,还对传统零售业的销售渠道、价格竞争和服务质量等方面产生了深远的影响。本文将详细分析电商对传统零售业的影响,以期为传…...

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal(Ruizhou Sun、Yukun Su、Qingyao Wu)[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…...

C++初阶(十五)Stack和Queue

文章目录 一、Stack的模拟实现二、Queue的模拟实现三、容器适配器1、什么是容器适配器2、STL标准库中stack和queue的底层结构3、 deque的简单介绍(了解)1、deque的原理介绍2、deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容器 一、Stack的模拟实现 #include<…...

C#面试题

基本概念 装箱和拆箱 装箱的过程&#xff0c;是将 值类型 转换为 引用类型 的过程&#xff1b; 拆箱则是将引用类型转换为值类型。 int val 100; object obj val; //装箱 int num (int) obj; //拆箱 委托(delegate) 委托&#xff08;Delegate&#xff09; 是存有对某个…...

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…...

二叉排序树的判断(二叉树的顺序存储):2022年408算法题

对于采用顺序存储方式保存的二叉树&#xff0c;根结点保存在SqBiTNode[0]中&#xff1b;当某结点保存SqBiTNode[i]中时&#xff0c;若有左孩子&#xff0c;则其值保存在SqBiTNode [2i1]中&#xff1b;若有右孩子&#xff0c;则其值保存在SqBiTNode[2i2]中&#xff1b;若有双亲结…...

Kubernetes版本升级到v1.18.0方法

升级k8s版本才能使用kube-prometheus安装监控 1、查看集群状态 [rootk8s-master k8s-script]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 5d22h v1.18.0 k8s-slave1 Ready <none> 4d10h v1.18.0 k…...

了解 git rebase

了解 git rebase 大多数人习惯使用 git merge 将更改从功能分支合并到主分支&#xff0c;但还有其他方法。我们是否曾经遇到过 git rebase 这个术语并想知道它是什么&#xff1f;或者我们可能听说过 rebase 和 merge &#xff0c;但不确定何时使用哪个&#xff1f;不用担心&am…...

程序员的养生之道:延寿健康的十大秘诀(下)

程序员的养生之道&#xff1a;延寿健康的十大秘诀&#xff08;上&#xff09;-CSDN博客 目录 6. 心理调节&#xff0c;减轻压力 6.1 程序员常见的心理问题 6.2 压力管理的重要性 6.3 放松技巧与应对策略 6.4 积极心态与心理健康 7. 正确坐姿&#xff0c;保护颈椎腰椎 …...

【java】保留前N月数据文件,定期删除数据

数据越积越多&#xff0c;过于冗余&#xff1b;数据库定期删除指定时间前的数据&#xff1b;文件生成的删除指定时间前端文件 SFTP文件定期删除 java sftp 定时清理指定文件中固定时间 依赖 <!-- ftp文件上传/下载Jar包 --> <dependency><groupId>com.jc…...

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…...

K8S学习指南(1)-docker的安装

文章目录 引言1. Windows 系统中安装 Dockera. 确认系统要求b. 下载 Docker Desktopc. 安装 Docker Desktopd. 配置 Docker Desktope. 验证安装 2. Ubuntu 系统中安装 Dockera. 更新包列表b. 安装依赖包c. 添加 Docker GPG 密钥d. 添加 Docker APT 仓库e. 安装 Dockerf. 添加用…...

vue3 + mark.js 实现文字标注功能

效果图 安装依赖 npm install mark.js --save-dev npm i nanoid代码块 <template><!-- 文档标注 --><header><el-buttontype"primary":disabled"selectedTextList.length 0 ? true : false"ghostclick"handleAllDelete"…...

运筹优化 | 模拟退火求解旅行商问题 | Python实现

"""模拟退火旅行商""" import random import numpy as np import math import time import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False location np.loadtxt(city_location.t…...

1017 A除以B

本题要求计算 A/B&#xff0c;其中 A 是不超过 1000 位的正整数&#xff0c;B 是 1 位正整数。你需要输出商数 Q 和余数 R&#xff0c;使得 ABQR 成立。 输入格式&#xff1a; 输入在一行中依次给出 A 和 B&#xff0c;中间以 1 空格分隔。 输出格式&#xff1a; 在一行中依…...

SAP UI5 walkthrough step8 Translatable Texts

在这个章节&#xff0c;我们会将一些文本常量独立出一个资源文件 这样的话&#xff0c;可以方便这些文本常量被翻译成任意的语言 这种国际化的操作&#xff0c;我们一般命名为i18n 新建一个文件i18n.properties webapp/i18n/i18n.properties (New) showHelloButtonTextSay …...

RocketMQ-源码架构二

梳理一些比较完整&#xff0c;比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xff0c;对消息持久化机制的设计&#xff0c;是…...

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...