FFmpeg 的常用API
FFmpeg 的常用API
附录:FFmpeg库介绍
库 | 介绍 |
---|---|
libavcodec | 音视频编解码核心库 编码 ( avcodec_send_frame , avcodec_receive_packet )。解码 ( avcodec_send_packet , avcodec_receive_frame )。 |
libavformat | 提供了音视频流的解析和封装功能,多种多媒体封装格式(如 MP4、MKV、FLV、TS、AVI 等)。 分配和初始化上下文 ( avformat_alloc_context , avformat_alloc_output_context2 )。解析媒体流 ( avformat_open_input )。写入媒体流 ( avformat_write_header , av_write_frame , av_write_trailer )。 |
libavutil | 提供多种辅助工具。 |
libswscale | 处理图像的缩放和色彩格式转换。像素格式转换(从 RGB 转换为 YUV420)。图像的尺寸缩放(如调整视频分辨率)。 转换像素格式 ( sws_scale )。分配和初始化上下文 ( sws_getContext )。 |
libswresample | 处理音频的重采样和格式转换 初始化重采样上下文 ( swr_alloc_set_opts , swr_init )。音频格式转换 ( swr_convert )。 |
libavdevice | 处理设备输入输出。 提供多媒体输入设备的支持(如摄像头、麦克风)。 |
libpostproc | 提供视频后处理功能。 主要用于视频质量增强(如去块效应、降噪处理)。配合视频解码器使用,改善解码后的视频质量。 |
附录1:参考文献
ffmpeg视频编解码流程:https://www.cnblogs.com/fxw1/p/17229792.html
常用API:https://www.cnblogs.com/linuxAndMcu/p/12041359.html
FFmpeg各版本区别:https://juejin.cn/post/7261245655128424509
附录2:编解码流程图
新版本ffmpeg4.0:
老版本ffmpeg3.0:
一、通用API
1.1 av_register_all()
初始化 libavformat 和注册所有的复用器muxer、解复用器demuxer和协议。(ffmpeg4.0已正式废弃)
void av_register_all(void);
1.2 avcodec_find_encoder
、avcodec_find_decoder
查找具有匹配编解码器ID的已注册编/解码器,位于 libavcodec\avcodec.h
// 函数的参数是一个编码器的ID,返回查找到的编码器(没有找到就返回NULL)。
AVCodec *avcodec_find_encoder(enum AVCodecID id);// 函数的参数是一个解码器的ID,返回查找到的解码器(没有找到就返回NULL)。
AVCodec *avcodec_find_decoder(enum AVCodecID id);
1.3 avcodec_open2()
**初始化一个视音频编解码器的 AVCodecContext以使用给定的AVCodec。**声明位于 libavcodec\utils.c
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
avctx
:需要初始化的 AVCodecContext。codec
:输入的AVCodec。options
:一些选项。例如使用libx264编码的时候,“preset”,“tune”等都可以通过该参数设置。
1.4 avcodec_close()
关闭给定的avcodeContext并释放与之关联的所有数据,声明位于 libavcodec\utils.c
int avcodec_close(AVCodecContext *avctx);
二、解码相关API
2.1 avformat_open_input()
打开输入流和读取头信息,流必须使用avformat_close_input()关闭
int avformat_open_input(AVFormatContext **ps,const char *url,AVInputFormat *fmt, AVDictionary **options);
ps
:用户提供的AVFormatContext(由avformat_alloc_context分配)的指针。url
:打开的视音频流的 URL。fmt
:如果!=NULL
,则此参数强制使用特定的输入格式。否则将自动检测格式。options
:包含AVFormatContext和demuxer私有选项的字典;一般情况下可以设置为 NULL。
2.2 avformat_find_stream_info()
**读取检查媒体文件的数据包以获取具体的流信息,**如媒体存入的编码格式。
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
ic
:媒体文件的上下文options
:字典,配置选项
2.3 av_read_frame
读取码流中的音频若干帧或者视频一帧
例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame() 获得一帧视频的压缩数据,然后才能对该数据进行解码。
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
2.4 avcodec_send_packet()
新版FFMPEG4.0引入:主要用于将编码或解码的数据包(Packet)送入编解码器的输入队列
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
-
avctx
:指向AVCodecContext
结构的指针,包含与编码器或解码器相关的配置信息。(如avcodec_open2
初始化的编解码器) -
avpkt
:指向AVPacket
结构的指针,表示要送入编解码器的输入数据包。(如av_read_frame
的数据包)
2.5 avcodec_receive_frame()
新版FFMPEG4.0引入:用于从解码器获取解码后帧
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
-
avctx
:指向AVCodecContext
结构的指针,它包含与解码器相关的上下文和配置信息。你必须在解码器初始化后(通过avcodec_open2
)提供此参数。 -
frame
:指向AVFrame
结构的指针,接收解码后的帧数据。AVFrame
是一个结构体,表示解码后的视频或音频数据。解码后的数据将存储在这个结构中。
为什么要使用 avcodec_send_packet
和 avcodec_receive_frame
- 分离输入和输出:使用这两个函数可以将输入和输出解耦,给解码器提供更大的灵活性。例如,在多线程环境中,你可以在一个线程中调用
avcodec_send_packet
发送数据包,而在另一个线程中调用avcodec_receive_frame
获取解码结果。 - 线程安全:新版的 API 提供了线程安全的机制,尤其适用于异步解码或编码任务。
- 增强性能和灵活性:通过逐步处理数据,避免了直接处理整个解码过程所带来的性能瓶颈。
2.6 avformat_close_input()
对应2.1;关闭打开的流。并释放AVFormatContext的所有内容并将*s设置为空
void avformat_close_input(AVFormatContext **s)
## 三、编码相关API### 3.1 `avformat_alloc_output_context2`> 用于**分配并初始化**一个输出媒体格式的上下文 (`AVFormatContext`) (通常是第一个调用的函数)```c++
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, const char *format_name, const char *filename);
-
ctx
:指向输出上下文指针的指针,用于存储分配的AVFormatContext
。 -
oformat
:指定输出格式(AVOutputFormat
),可以为NULL
。如果为NULL
,则根据format_name
或filename
自动推断格式。 -
format_name
:指定输出格式的名称(如"mp4"
、"mkv"
等),用于明确输出文件的封装格式。可以为NULL
。 -
filename
:输出文件的名称。此参数会用于推断格式(如果oformat
和format_name
都为NULL
)。
3.2 avformat_write_header()
为输出文件写入文件头,准备文件封装格式所需的元数据。
int avformat_write_header(AVFormatContext *s, AVDictionary **options);
-
s
(AVFormatContext):指向输出上下文 (AVFormatContext
) 的指针,必须是用avformat_alloc_output_context2
创建的,并且已经设置好音视频流 (AVStream
)。 -
options
(AVDictionary**):用于传递格式化选项的字典指针,可以为NULL
。-
设置编码参数(如比特率
bit_rate
)。 -
设置容器格式选项(如
movflags
)。 -
需要在调用完成后手动释放(通过
av_dict_free
)。
-
3.3 av_write_frame()
用于将单个媒体包(
AVPacket
)写入输出文件。它是音视频数据封装的重要步骤,直接处理编解码后的数据帧。
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
s
(AVFormatContext*)
指向输出上下文的指针,通常由 avformat_alloc_output_context2
创建并初始化。
pkt
(AVPacket*)
包含需要写入的媒体数据的包(AVPacket
)。它应该包含目标流的索引 (stream_index
)、解码后的时间戳(PTS/DTS)、以及数据缓冲区。
3.4 av_write_trailer()
用于输出文件尾
int av_write_trailer(AVFormatContext *s)
四、图像处理API
4.1 sws_getContext()
用于初始化一个缩放上下文 (
SwsContext
),以便进行视频像素格式的转换或尺寸缩放。
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,int dstW, int dstH, enum AVPixelFormat dstFormat,int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param
);
-
srcW
和srcH
:输入图像的宽度和高度。srcFormat
:输入图像的像素格式(AVPixelFormat
枚举值,例如AV_PIX_FMT_YUV420P
)。 -
dstW
和dstH
:输出图像的宽度和高度。dstFormat
:输出图像的像素格式(例如AV_PIX_FMT_RGB24
)。 -
flags
:用于控制缩放的算法。可以是以下值之一或它们的组合:-
SWS_FAST_BILINEAR
:快速双线性缩放。 -
SWS_BILINEAR
:双线性缩放。 -
SWS_BICUBIC
:双三次插值缩放(质量高)。 -
SWS_LANCZOS
:Lanczos重采样(质量最高)。
-
-
srcFilter
和dstFilter
:分别为输入和输出图像使用的滤波器。通常为NULL
。 -
param
:滤波器相关参数,通常为NULL
。
4.2 sws_scale()
libswscale
库中的关键函数,用于在图像转换和缩放过程中执行实际的像素格式转换和尺寸调整操作。它在sws_getContext
初始化的上下文中完成图像数据处理
int sws_scale(struct SwsContext *c,const uint8_t * const srcSlice[],const int srcStride[], int srcSliceY,int srcSliceH, uint8_t *const dst[],const int dstStride[]) )
c
(struct SwsContext):指向由 sws_getContext
返回的上下文结构体,定义了转换和缩放的参数。
srcSlice
(const uint8_t *const[]):输入图像的每个平面的指针数组(通常是 AVFrame->data
)。
srcStride
(const int[]):输入图像每行的字节数数组,对应每个数据平面(通常是 AVFrame->linesize
)。
srcSliceY
(int):输入图像处理的起始行号,通常为 0。
srcSliceH
(int):输入图像处理的行数(高度),例如 AVFrame->height
。
dst
(uint8_t *const[]):输出图像的每个平面的指针数组,存储转换后的数据。
dstStride
(const int[]):输出图像每行的字节数数组,对应每个数据平面。
4.3 sws_freeContext()
释放一个 SwsContext
void sws_freeContext(struct SwsContext *swsContext)
相关文章:
FFmpeg 的常用API
FFmpeg 的常用API 附录:FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能,多种多媒体封装格式&…...
【软件】教务系统成绩提交工具使用步骤
【软件】教务系统成绩提交工具使用步骤 零、快速开始 安装 与大多数软件一样,安装步骤很简单,一直点击“下一步”即可快速完成安装,安装完成后,在桌面会有一个软件图标,双击即可打开软件主界面。 导入成绩到Excel中…...
es快速扫描
介绍 Elasticsearch简称es,一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群,处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对,正排索引是根据id进行索引,所以查询效率非常高,但是模糊…...
埃斯顿机器人程序模版案例,欢迎指点
埃斯顿机器人程序模版案例,欢迎指点...
解锁成长密码:探寻刻意练习之道
刻意练习,真有那么神? 在生活中,你是否有过这样的困惑:每天苦练英语口语,可一到交流时还是支支吾吾;埋头苦学吉他,却总是卡在几个和弦转换上;工作多年,业务能力却似乎陷入…...
对外发PDF设置打开次数
在线 Host PDF 文件并对链接进行限制——保障文件安全的最佳解决方案 在数字化办公和远程协作日益普及的今天,如何安全高效地分享 PDF 文件成为许多用户关注的重点。MaiPDF 作为一款功能强大的在线工具,不仅支持在线 host PDF 文件,还提供多…...
【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别
su 命令 su (Switch User 切换用户),允许用户切换到另一个用户的身份,默认情况下是切换到 root 用户。 默认行为:如果只运行 su,则系统会要求输入 root 用户的密码来切换到 root 用户,获取管理员权限。 切换到其他用…...
leetcode hot 100搜索回溯
39. 组合总和 已解答 中等 相关标签 相关企业 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candi…...
记录-->为2025添砖java的第二天
如何在java中创建自己的方法呢,我认为它和在C语言c里面写函数就没啥区别,(⊙﹏⊙),可能有一点点就是说public static int add(int a,int b){}就是得和main方法里面的状态一致。 import java.util.Scanner; public class Math3 {public stati…...
uniapp小程序实现弹幕不重叠
uniapp小程序实现弹幕不重叠 1、在父组件中引入弹幕组件 <template><!-- 弹幕 --><barrage ref"barrage" class"barrage-content" reloadDanmu"reloadDanmu"></barrage> </template> <script>import barr…...
拼多多纠偏,能否实现买卖平权?
科技新知 原创作者丨江蓠 编辑丨蕨影 当曾将仅退款、运费险作为标配的电商平台们开始听到商家诉求,有意优化营商环境,作为“仅退款”服务发起者的拼多多也坐不住了。 在推出一揽子减免计划讨好中小商家之后,拼多多近期被传正在内测精选用户…...
【Leetcode】3159. 查询数组中元素的出现位置
文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 给你一个整数数组 nums ,一个整数数组 queries 和一个整数 x 。 对于每个查询 q u e r i e s [ i ] queries[i] queries[i] ,你需要找到 n u m s nums nu…...
PHP语言laravel框架中基于Redis的异步队列使用实践与原理
在 Laravel 中,基于 Redis 的异步队列是通过 Laravel 的队列系统与 Redis 服务结合来实现的。这种队列机制允许你将任务推送到队列中,并由后台工作进程异步处理这些任务。这样,你就可以将耗时的操作(如发送邮件、处理视频、数据同…...
Element-plus自动导入
安装 npm i element-plus 自动引入 1. 安装两个插件 npm install -D unplugin-vue-components unplugin-auto-import2. 配置插件 vue3项目修改vite.config.js,把两个插件添加入即可,注意:不是覆盖原有配置 Vite // vite.config.js import { define…...
贪心算法(常见贪心模型)
常见贪心模型 简单排序模型 最小化战斗力差距 题目分析: #include <bits/stdc.h> using namespace std;const int N 1e5 10;int n; int a[N];int main() {// 请在此输入您的代码cin >> n;for (int i 1;i < n;i) cin >> a[i];sort(a1,a1n);…...
碰一碰发视频后端源码技术开发详解,支持OEM
一、引言 碰一碰发视频作为一种新颖的交互方式,在前端为用户带来便捷体验的同时,后端技术起着至关重要的支撑作用。后端负责管理视频资源、处理 NFC 标签信息与视频的关联逻辑、用户数据的存储与分析以及与前端的高效通信,确保整个系统稳定、…...
Python vs PHP:哪种语言更适合网页抓取
本文将比较 Python 和 PHP,以帮助读者确定哪种语言更适合他们的需求。文章将探讨两种语言的优点和缺点,并根据读者的经验水平分析哪种语言可能更容易上手。接下来,文章将深入探讨哪种语言在抓取网页数据方面更胜一筹。 简而言之,…...
SpringBoot 新特性
优质博文:IT-BLOG-CN 2.1.0新特性最低支持jdk8,支持tomcat9 对响应式编程的支持,spring-boot-starter-webflux starter POM可以快速开始使用Spring WebFlux,它由嵌入式Netty服务器支持 1.5.8 2.1.0/2.7.0/3.0.0 Configuration propertie…...
NAT 技术如何解决 IP 地址短缺问题?
NAT 技术如何解决 IP 地址短缺问题? 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 随着互联网的普及和发展,IP 地址的需求量迅速增加。尤其是 IPv4 地址&…...
微积分复习(微分方程)
1,一阶微分方程 可分离的微分方程: 可以把x和y分列等号两边,然后求积分可以解决 齐次方程和准齐次方程 要求是 :yf(y/x),也就是没有单独的x项,我们可以通过设ty/x来统一变量方便我们运算 准齐次方程就是常数项不统一,我们可以将Xxa,Yyb来消灭常数项进而转化为齐次形式…...
动态规划子序列问题系列一>等差序列划分II
题目: 解析: 1.状态表示: 2.状态转移方程: 这里注意有个优化 3.初始化: 4.填表顺序: 5.返回值: 返回dp表总和 代码: public int numberOfArithmeticSlices(int[] nums) {in…...
【连续学习之SSL算法】2018年论文Selfless sequential learning
1 介绍 年份:2018 期刊: arXiv preprint Aljundi R, Rohrbach M, Tuytelaars T. Selfless sequential learning[J]. arXiv preprint arXiv:1806.05421, 2018. 本文提出了一种名为SLNID(Sparse coding through Local Neural Inhibition and…...
【FastAPI】中间件
【FastAPI】中间件 一、概述二、作用2.1 日志记录与监控2.2 身份验证与授权2.3 CORS(跨域资源共享)2.4 Gzip压缩2.5 会话管理2.6 自定义功能2.7 执行顺序 三、 总结四、相关链接 一、概述 FastAPI的中间件提供了一种强大的机制,允许开发者在…...
文档大师:打造一站式 Word 报告解决方案1
前言 在政府、医院、银行、财务以及销售等领域,常常需要创建各种报告文件来展开工作汇报,譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前,这类报告主要通过 Word 制作,费时费力且难以维护&#…...
再谈c++线性关系求值
目的 线性关系是最简单的一种关系,在编程当中应用非常多,所以,再说一次线性关系。 线性关系的定义是这样的: 两个变量之间存在一次方函数关系,就称它们之间存在线性关系。正比例关系是线性关系中的特例,反…...
【ES6复习笔记】Class类(15)
介绍 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,…...
AppAgent 源码 (xml 解析)
1. 数据准备 adb shell uiautomator dump /sdcard/output.xml # 获取手机ui界面的xml文件 adb pull /sdcard/output.xml output.xml # 将手机上的xml文件拉取到电脑上具体的xml文件: <?xml version1.0 encodingUTF-8 standaloneyes ?> <hierarchy ro…...
Oracle 11G还有新BUG?ORACLE 表空间迷案!
前段时间遇到一个奇葩的问题,在开了SR和oracle support追踪两周以后才算是有了不算完美的结果,在这里整理出来给大家分享。 1.问题描述 12/13我司某基地MES全厂停线,系统卡死不可用,通知到我排查,查看alert log看到是…...
FreeSwitch中启用WebRTC
在FreeSwitch中启用WebRTC需要进行一系列配置。以下是详细的步骤: 1. 安装必要的依赖: 确保安装了支持WebRTC的依赖库,如libsrtp。 2. 配置SIP Profile: 编辑 conf/sip_profiles/internal.xml 文件,添加或修改以下内…...
力扣矩阵-算法模版总结
lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…...
服务端高并发分布式结构演进之路
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 服务端高并发分布式结构演进之路 收录于专栏[redis] 本专栏旨在分享学习Redis的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 概述 …...
虚拟机桥接模式
主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单:编辑>虚拟机网络编辑,点击“更改设置”,可以看到三个网卡,这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0,如果没看到这个网卡&…...
JVM调优实践篇
理论篇 1多功能养鱼塘-JVM内存 大鱼塘O(可分配内存): JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…...
SpeedTree学习笔记总结
SpeedTree是一款业界领先的三维树木植被建模软件,特别适用于游戏开发和影视制作。 一、基础操作 旋转:鼠标左键 平移:鼠标中键 缩放:鼠标中键滚动 Trunks树干节点 Branches树枝 Cap给树干封口 Frond创建大树叶 Decorations…...
【MuJoCo和PhysX】
MuJoCo 与 Unity 的 PhysX 引擎的主要区别 应用领域: MuJoCo:主要用于机器人学、强化学习、生物力学等领域,擅长处理多自由度、复杂动力学问题,尤其适合进行高精度的物理仿真。 Unity PhysX:主要用于游戏开发、虚拟现…...
HTML制作一个普通的背景换肤案例2024版
一,完整的代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>换肤</t…...
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作,相关链接为: python学opencv|读取图像(二十)使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单,因此可以自由操作的空间也就大&#x…...
qt QZipReader详解
1、概述 QZipReader 是 Qt 中用于从 .zip 文件中读取和提取文件内容的类。它提供了便捷的方法来访问压缩包中的文件和目录,并允许你解压缩单个或多个文件。通过 QZipReader,你可以以编程方式读取 .zip 文件中的内容,并提取它们到目标目录中。…...
开发场景中Java 集合的最佳选择
在 Java 开发中,集合类是处理数据的核心工具。合理选择集合,不仅可以提高代码效率,还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点,帮助你在实际开发中找到最佳解决方案。 一、List:有序存…...
顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点: 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…...
bash shell的条件语句
~ script% touch if.sh ~ script% chmod 755 if.sh1.if-then-fi #!/usr/bin/env bashFOOD$1 if [ $FOOD"apple" ] thenecho The food is $FOOD fi exit 0~ script % ./if.sh apple The food is apple如果要将多条语句写在一行,可以…...
拦截器Interceptor与过滤器Filter
拦截器Interceptor 定义: SpringMVC内置拦截机制,允许在请求被目标方法处理的前后进行拦截,执行一些额外操作;比如:权限验证,日志记录,数据共享等。 实现步骤 1、自定义拦截器 Component public class …...
水电站视频智能监控系统方案设计与技术应用方案
一、背景需求 水电站作为国家重要的能源基地,其安全运行对于保障能源供应和社会稳定具有重要意义。然而,传统的人工监控方式存在着诸多问题,如人力成本高、监控范围有限、反应不及时等。因此,水电站急需引进一种先进的视频智能监控…...
教师管理系统
大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…...
nexus docker安装
#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…...
canvas之进度条
canvas之进度条 效果: 封装的组件 <template><div class"circle" :style"{ width: props.radius px, height: props.radius px }"><div class"circle-bg" :style"{ width: props.radius - 5 px, height: pr…...
【ES6复习笔记】Promise对象详解(12)
1. 什么是 Promise? Promise 是 JavaScript 中处理异步操作的一种机制,它可以让异步操作更加容易管理和控制。Promise 对象代表一个异步操作的最终完成或失败,并提供了一种方式来处理操作的结果。 2. Promise 的基本语法 Promise 对象有三…...
前端Python应用指南(五)用FastAPI快速构建高性能API
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
c#多线程之生产者-消费者模型
在 C# 中实现 生产者-消费者模式,通常需要多个线程来处理数据的生产和消费。我们可以使用 Queue<T> 来作为存储数据的队列,并使用 Thread、Mutex 或 Monitor 来确保线程安全。BlockingCollection<T> 是 C# 提供的一个线程安全的集合…...
2011-2020年各省城镇职工基本医疗保险年末参保人数数据
2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间:2011-2020年 2、来源:国家统计局 3、指标:省份、时间、城镇职工基本医疗保险年末参保人数 4、范围:31省 5、指标解释:参保人数指报告期末按国家有关…...