(三)ffmpeg 解码流程以及函数介绍
一、视频解码流程
二、函数介绍
1.avformat_network_init
函数作用:
执行网络库的全局初始化。这是可选的,不再推荐。
此函数仅用于解决旧GnuTLS或OpenSSL库的线程安全问题。如果libavformat链接到这些库的较新版本,或者不使用它们,则不需要调用此函数。否则,您需要在启动使用该函数的任何其他线程之前调用该函数。 一旦删除对旧GnuTLS和OpenSSL库的支持,此函数将被弃用,并且此函数没有任何用途。
2.av_dict_set
函数作用:
用于向字典中添加键值对。它可以被用来传递多种数据,例如视频解码参数、音频参数、字幕参数等等。
函数原型:
int av_dict_set(AVDictionary **pm,const char *key, const char *value, int flags);
参数说明:
pm
:指向AVDictionary
结构的指针,该结构将被填充以包含新的键值对。
key
:要添加到字典中的键。
value
:与键关联的值。
flags
:可选参数,指定如何处理重复的键。0:默认,默认情况下,如果键已经存在,则新值将覆盖旧值。AV_DICT_DONT_OVERWRITE
:如果已经存在键名,则不会执行任何操作,避免覆盖。AV_DICT_APPEND:如果关键字已经定义,则将其与新的值合并。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
常见用法:
av_dict_set(&options, "rtsp_transport", "tcp", 0); //使用 TCP 方式
av_dict_set(&options, "buffer_size", "1024", 0); // 设置缓冲区大小为1024字节av_dict_set(&options, "max_delay", "200", 0);//设置接收包间隔最大延迟,微秒av_dict_set(&options, "timeout", "5000000", 0); // 设置超时时间为5秒(单位为微秒)
av_dict_set(&options, "stimeout", "3000000", 0);//设置阻塞超时,否则可能在流断开时连接发生阻塞,微秒
3.avformat_open_input
函数作用:
用于打开多媒体文件或流并初始化用于读取数据的结构。这个函数是FFmpeg多媒体处理流程的起点,通常用于设置后续的解码、编码或其他处理步骤。
函数原型:
int avformat_open_input(AVFormatContext **ps,const char *url, AVInputFormat *fmt, AVDictionary **options);
参数说明:
ps
:指向AVFormatContext
结构的指针,该结构将被填充以包含媒体文件的信息和IO上下文。本函数如果打开媒体成功,会返回一个AVFormatContext的实例。
url
:要打开的文件名或流的URL。
fmt
:可选参数,指定要尝试探测的特定输入格式。如果为NULL,则自动探测。
options
:可选参数,一个字典,包含一些特定的选项。这些选项可以影响解析过程或被用来设置特定格式的私有选项。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
4.avformat_find_stream_info
函数作用:
用于获取媒体文件的流信息。它通过解析媒体文件的头部数据来确定每个流的类型、编码格式和其他相关信息。
函数原型:
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
参数说明:
ic
:指向AVFormatContext
结构的指针,该结构包含媒体文件的信息和IO上下文。
options
:可选参数,一个字典,包含一些特定的选项。这些选项可以影响解析过程或被用来设置特定格式的私有选项。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
5.av_find_best_stream
函数作用:
用于在给定的媒体文件中查找最佳流。它可以根据指定的条件(如编码格式、类型等)来选择最佳的流。
函数原型:
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags);
参数说明:
ic
:指向AVFormatContext
结构的指针,该结构包含媒体文件的信息和IO上下文。
type
:要查找的流的类型,可以是音频、视频或字幕等。
wanted_stream_nb
:可选参数,指定要查找的流的索引号。如果为-1,则自动选择最佳流。
related_stream
:可选参数,指定与要查找的流相关的流的索引号。例如,如果要查找的视频流与音频流相关联,可以设置此参数为音频流的索引号。
decoder_ret
:可选参数,一个指向AVCodec
结构的指针,用于返回找到的最佳流的解码器。
flags
:可选参数,用于控制查找过程的行为。可以使用AVFMT_FLAG_GENPTS
标志来生成时间戳。默认为0
返回值:
返回值为整数类型。如果成功,返回找到的最佳流的索引号;否则返回一个负数错误码。
6.avcodec_find_decoder
函数作用:
用于查找指定编码格式的解码器。它可以根据给定的编码格式或编解码器ID来查找相应的解码器。(新版本返回值必须使用const)
函数原型:
AVCodec *avcodec_find_decoder(enum AVCodecID id);
参数说明:
id
:要查找的编解码器ID,可以是音频、视频或字幕等类型的编解码器ID。
返回值:
返回值为指向
AVCodec
结构的指针。如果成功找到解码器,则返回该解码器的指针;否则返回NULL。
7.avcodec_alloc_context3
函数作用:
用于分配编解码器上下文结构。它为指定的编解码器分配内存并初始化其字段。
函数原型:
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
参数说明:
codec
:指向要为其分配上下文结构的编解码器的指针。
返回值:
返回值为指向
AVCodecContext
结构的指针。如果成功分配和初始化上下文结构,则返回该结构的指针;否则返回NULL。
8.avcodec_parameters_to_context
函数作用:
用于将编解码器参数复制到编解码器上下文中。
函数原型:
int avcodec_parameters_to_context(AVCodecContext *ctx, const AVCodecParameters *par_out());
参数说明:
ctx
:指向要设置参数的编解码器上下文的指针。
par_out()
:指向要复制的编解码器参数的指针。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
9.avcodec_open2
函数作用:
用于打开编解码器并初始化其上下文。
函数原型:
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
参数说明:
avctx
:指向要打开的编解码器上下文的指针。
codec
:指向要打开的编解码器的指针。
options
:可选参数,一个字典,包含一些特定的选项。这些选项可以影响编解码器的打开过程或被用来设置特定格式的私有选项。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
10.av_read_frame
函数作用:
用于从媒体文件中读取一帧数据。
函数原型:
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
参数说明:
s
:指向要读取数据的媒体文件的格式上下文的指针。
pkt
:指向一个AVPacket
结构的指针,该结构将被填充以包含读取到的数据。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
11.avcodec_send_packet
函数作用:
用于将数据包发送到编解码器进行编码或解码。
函数原型:
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
参数说明:
avctx
:指向要发送数据包的编解码器上下文的指针。
avpkt
:指向要发送的数据包的指针。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
12.avcodec_receive_frame
函数作用:
用于从编解码器接收编码或解码后的数据帧。
函数原型:
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);
参数说明:
avctx
:指向要接收数据帧的编解码器上下文的指针。
frame
:指向一个AVFrame
结构的指针,该结构将被填充以包含接收到的数据帧。
返回值:
返回值为整数类型。如果成功,返回0;否则返回一个负数错误码。
13.sws_getContext
函数作用:
用于创建一个缩放和转换上下文。在调用该函数时,需要先确定源图像和目标图像的尺寸、像素格式以及是否需要进行某些特定的处理(例如缩放、裁剪、旋转等),然后根据这些信息来设置相应的参数。
函数原型:
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
表示源图像的像素格式;
dstW
和dstH
表示目标图像的宽度和高度;
dstFormat
表示目标图像的像素格式;
flags
表示一些选项,例如是否使用多线程等;
srcFilter
和dstFilter
表示源图像和目标图像的滤波器;
param
是一个可选参数,用于指定一些特定的参数
返回值:
返回值为一个指向新创建的缩放和转换上下文的指针。如果创建失败,则返回NULL。
14.av_image_get_buffer_size
函数作用:
用于计算图像缓冲区所需的内存大小。
函数原型:
int av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);
参数说明:
pix_fmt
:指定像素格式,例如YUV420P、RGB24等。
width
:指定图像的宽度。
height
:指定图像的高度。
align
:指定内存对齐的大小,通常为1或2。
返回值:
返回值为整数值,表示所需缓冲区的大小(以字节为单位)。
15.av_image_fill_arrays
函数作用:用于将图像数据填充到指定的缓冲区中。
函数原型:
int av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],const uint8_t *src,enum AVPixelFormat pix_fmt, int width, int height, int align);
参数说明:
dst_data
:指向目标缓冲区的指针数组,每个元素对应一个平面的数据指针。
dst_linesize
:指向目标缓冲区的行大小数组,每个元素对应一个平面的行大小。
src
:指向源数据的指针。
pix_fmt
:指定像素格式,例如YUV420P、RGB24等。
width
:指定图像的宽度。
height
:指定图像的高度。
align
:指定内存对齐的大小,通常为1或2。
返回值:
返回值为填充后的行大小数组;否则返回一个负数错误码。
16.av_strerror
函数作用:
用于将错误码转换为对应的错误信息字符串。
函数原型:
int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
参数说明:
errnum
:表示错误码的整数。
errbuf
:指向存储错误信息的字符数组的指针。
errbuf_size
:指定errbuf
的大小。
返回值:
返回一个整数值,表示转换后的错误信息字符串的长度。如果转换成功,则返回非负值;如果转换失败,则返回负值。
17.av_packet_alloc
函数作用:
分配AVPacket内存空间并将其字段设置为默认值。
函数原型:
AVPacket *av_packet_alloc(void);
参数说明:无
返回值:
返回一个AVPacket,填充了默认值或失败时为NULL。
这只分配AVPacket本身,而不是数据缓冲区。那些必须通过诸如av_new_packet之类的其他方式进行分配。
使用示例:
int ret = -5;char *error = new char[1024];
memset(error, 0, 1024);// 将数组置零av_strerror(ret, error, 1024);
qDebug()<<"错误原因:"<<QString::fromStdString(error)<<" 返回值:"<<ret;delete[] error;
error = NULL;
18.av_new_packet
函数作用:
初始化AVPacket结构体的字段。
函数原型:
int av_new_packet(AVPacket *pkt, int size);
参数说明:
pkt
:指向要分配的AVPacket结构体的指针。
size
:指定AVPacket结构体的大小。
返回值:
返回一个整数值,表示操作的结果。如果成功,则返回0;否则,返回负数表示错误码。
19.一些创建函数
avformat_alloc_context
:分配一个新的AVFormatContext
结构体,并初始化其字段为默认值。
avcodec_alloc_context3
:分配一个新的AVCodecContext
结构体,并设置其字段为默认值。
av_packet_alloc:分配一个新的AVPacket结构体,并设置其字段为默认值。
av_frame_alloc
:分配一个新的AVFrame
结构体并将其字段设置为默认值,用于存储视频帧或音频帧的数据。
av_malloc
:分配一块内存,该内存块可以用于存储多媒体数据或其他用途
20.一些释放资源函数
av_free(void *ptr):这个函数用于释放之前通过
av_malloc
、av_realloc
、av_mallocz
或av_calloc
等函数分配的内存。
av_freep(void * * ptr):这个函数与
av_free
类似,但它还会将指针设置为NULL,以避免悬挂指针的问题。
avformat_close_input(AVFormatContext **s):关闭媒体文件格式上下文,并释放与之相关的资源。
avcodec_close(AVCodecContext *avctx):关闭编解码器上下文,并释放其中的资源。
av_packet_unref(AVPacket *pkt):用于释放AVPacket结构体占用的内存。
av_free_packet(AVPacket *pkt):用于释放数据包,主要用于网络传输。
avformat_flush(AVFormatContext *s):用于清空
AVFormatContext
中的输入/输出缓冲区中的数据。
av_frame_free(AVFrame **frame):用于释放AVFrame结构体占用的内存。
sws_freeContext(SwsContext *sws):用于释放
SwsContext
结构体占用的内存。
在使用这些函数时,需要注意以下几点:
正确配对:确保使用
av_malloc
等分配的内存使用av_free
或av_freep
来释放。避免泄漏:在释放资源后,确保不再使用已释放的资源,以防止内存泄漏。
按顺序释放:如果多个资源之间存在依赖关系,应按照正确的顺序释放资源,以避免未定义的行为。
21.avformat_flush和av_frame_free区别
avformat_flush
:这个函数用于清空输入/输出缓冲区中的数据,确保所有的数据都已经读取或者写入。这对于同步多媒体流非常重要,尤其是在关闭文件之前确保所有数据都已经被处理完毕。它不会影响已经分配的内存,只是清空了数据内容。av_frame_free
:这个函数用于释放一个AVFrame
结构体及其相关的数据所占用的所有内存。AVFrame
是FFmpeg中表示音频或视频帧的结构体,当不再需要这个结构体时,应当使用av_frame_free
来释放它,以防止内存泄漏。总的来说,
avformat_flush
与av_frame_free
在功能上是不同的。前者是清空缓冲区数据,后者是释放帧结构体内存。
22.av_packet_unref和av_free_packet区别
av_packet_unref
:该函数减少AVPacket
的引用计数。如果引用计数减到0,则该函数会释放AVPacket
及其数据缓冲区。通常用于解码过程中,当一个AVPacket
不再被需要时,可以调用这个函数来避免内存泄露。av_free_packet
:该函数释放AVPacket
结构体本身以及它所包含的数据。与av_packet_unref
不同,av_free_packet
不仅释放了AVPacket
结构体,还释放了与它关联的所有数据。总的来说,如果你只想释放
AVPacket
的数据部分而不是整个结构体,可以使用av_packet_unref
。而如果你想要彻底地释放AVPacket
结构体以及其数据,那么应该使用av_free_packet
。
相关文章:

(三)ffmpeg 解码流程以及函数介绍
一、视频解码流程 二、函数介绍 1.avformat_network_init 函数作用: 执行网络库的全局初始化。这是可选的,不再推荐。 此函数仅用于解决旧GnuTLS或OpenSSL库的线程安全问题。如果libavformat链接到这些库的较新版本,或者不使用它们&#…...

go work模块与go mod包管理是的注意事项
如下图所示目录结构 cmd中是服务的包,显然auth,dbtables,pkg都是为cmd服务的。 首先需要需要将auth,dbtables,pkg定义到go.work中,如下: 在这样在各个单独的go mod管理的模块就可以互相调用了。一般情况下这些都是IDE自动进行的,…...

华为OD-C卷-最长子字符串的长度(一)[100分]
题目描述 给你一个字符串 s,首尾相连成一个环形,请你在环中找出 o 字符出现了偶数次最长子字符串的长度。 输入描述 输入是一个小写字母组成的字符串 输出描述 输出是一个整数 备注 1 ≤ s.length ≤ 500000s 只包含小写英文字母用例1 输入 alolobo输出 6说明 最长子字…...

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例
传统Wi-Fi网络所有终端设备都需要直接与路由器相连,这使得Wi-Fi的覆盖区域受到路由器位置的限制,可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案,所有终端设备都可以与相邻设备连接,摆脱了对路由…...

SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案
带米勒钳位的隔离驱动SiLM5350系列 单通道 30V,10A 带米勒钳位的隔离驱动 具有驱动电流更大、传输延时更低、抗干扰能力更强、封装体积更小等优势, 为提高电源转换效率、安全性和可靠性提供理想之选。 SiLM5350系列产品描述: SiLM5350系列是单通道隔离驱…...

c#中怎么自动下载软件
以下是一个简单的 C# 示例,演示如何使用 WebClient 类下载软件: using System; using System.Net; class Program { static void Main(string[] args) { // 要下载的文件 URL string fileUrl "https://example.com/path/to/file"; // 本地保…...

Unity笔记之下拉刷新列表
这样的效果; 代码: using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class ScrollRectUpdateView : Mon…...

防火墙操作!
当小编在Linux服务器上部署好程序以后,但是输入URL出现下述情况,原来是防火墙的原因!! 下面是一些防火墙操作! 为保证系统安全,服务器的防火墙不建议关闭!! 但是,我们可…...
代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树
题目与题解 343. 整数拆分 题目链接:343. 整数拆分 代码随想录题解:343. 整数拆分 视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili 解题思路: 一眼懵…...
【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。
操作环境: MATLAB 2022a 1、算法描述 粒子群算法(Particle Swarm Optimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述: 基本思想: 鸟群在寻找食物时,每只鸟都…...

el-table多行合并
背景 前端统计列表,数据乱序。按日期、产品、阶段、DD项(所有header名称乱写)排序,列表如下。 示例 日期产品阶段DDEEFFGG20240414产品1阶段1场景1A01场景2B01其他A0120240410产品1阶段1场景2B01其他A0120240402产品2阶段1场景3…...

Vue3 + Element-Plus 使用 Table 插槽时数据未及时更新
Vue3 Element-Plus 使用 Table 插槽时数据未及时更新 问题重现解决方法最终效果 问题重现 这里我已经通过二级分类 id 查询到一级分类和二级分类,但是使用插槽和 v-for 渲染出来还是之前的分类 id,但是一点击表格或者保存代码他又能正常刷新出来。 <…...

vue 2 怎么把2024-04-13T17:42:19转换成短日期格式
我们在日常开发过程中,通常会将日期格式在entity中设置成LocalDateTime。这样就有一个麻烦,我们在前端展示这个日期的时候就会变成2024-04-13T17:42:19。这显然不是我们所要的效果,所以我们今天来解决这个问题,让前端展示正确的日…...

网络IO模型以及实际应用
网络IO模型 本文主要介绍了几种不同的网络IO模型,以及实际应用中使用到的Reactor模型等。 我们常说的网络IO模型,主要包含阻塞IO、非阻塞IO、多路复用IO、信号驱动IO、异步IO。 根据第一个阶段:是否需要阻塞,分为阻塞和非阻塞IO。…...

一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系
经常遇到很多系统,比如:MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM,这些都是什么系统?有什么功能和作用?它们之间的关系是怎样的? 今天就一文详细分享给大家。 10大系统之间的关系 ERP 和其他…...

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本,出现了一个问题,就是在pod中访问百度网站,大概时间有10s多,这个时间太长了,尝试了各种办法,都解决不了,后面尝试安装了了1.26.…...

maven命令
mvn archetype:generate 创建 Maven 项目 mvn compile 编译源代码 mvn deploy 发布项目 mvn test-compile 编译测试源代码 mvn test 运行应用程序中的单元测试 mvn site 生成项目相关信息的网站 mvn clean 清除项目目录中的生成结果 mvn package 根据项目生成的 jar mvn instal…...

jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况
在双系统中的ubuntu系统烧录没问题,但是电脑Ubuntu系统由于版本低,所以没有网络,烧录起来还的连网线,所以问了开发板的工程师,所幸,解决了问题,很感谢工程师的指导,特此记录一下&…...

【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2
目录 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题一、交换二叉树每个结点的左右孩子Swap 函数(先序遍历):Swap 函数(中序遍历) 不可行:Swap 函数(后序遍历)ÿ…...

Cesium之home键开关及相机位置设置
显隐控制 设置代码中的homeButton var TDT_IMG_C "https://{s}.tianditu.gov.cn/img_c/wmts?servicewmts&requestGetTile&version1.0.0" "&LAYERimg&tileMatrixSetc&TileMatrix{TileMatrix}&TileRow{TileRow}&TileCol{TileCol}…...

FreeRTOS_day1
1.总结keil5下载代码和编译代码需要注意的事项 下载代码前要对仿真进行设置 勾选后代码会立刻执行 勾选后会导致代码不能执行 写代码的时候要写在对应的begin和end之间,否则会被覆盖 2.总结STM32Cubemx的使用方法和需要注意的事项 ①打开软件,新建工程…...

Nginx日志格式化和追踪
背景 Nginx是一款功能强大的Web服务器,对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中,我们将深入探讨Nginx日志格式的高级定制化策略,包括理解基…...

华为交换机配置telnet SSH登录步骤
这次项目中的交换机是华为 S5735-L24T4X 需要配置telnet和 SSH登录 在平时项目中发现,华为不同型号,不同版本的配置命令也是不同,(这不是脑子有问题吗? 干啥搞成不一样的) 本次型号:S5735-L2…...

市面上加密混淆软件的比较和推荐
引言 市面上有许多加密混淆软件可供开发者使用,但哪些软件是最好用的?哪些软件受到开发者的喜爱?本文将根据一次在CSDN上的投票结果,为大家介绍几款在程序员中普及度较高的加密软件。以下是投票结果,希望能对大家的选择…...

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图
一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…...

电视盒子哪个好?2024口碑网络电视盒子排行榜
多年来电视盒子始终占据重要地位,功能上并没有受到影响。在这么多品牌中哪些电视盒子的评价是最好的呢?小编根据各大电商平台的用户评价情况整理了口碑最好的网络电视盒子排行榜,跟着小编一起看看市面上的电视盒子哪个好吧。 TOP 1࿱…...

CookieSession
目录 什么是会话 一.Cookie 1.Cookie介绍 2.Cookie的作用 3.Cookie的基本使用 4.Cookie生命周期 5.Cookie有效路径 6.注意事项 二.Session 1.Session基本原理 2 Session的作用 3.Session的基本使用 4.Session底层实现机制 5.Session生命周期 什么是会话 Cookie和S…...

Nginx服务 重写功能与反向代理
六、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的…...

Midjourney教程(完整版)-看这篇就够了
Midjourney使用指南 - 订阅计划费用比较 Midjourney 具有三个订阅版本。按月或全年支付可享受 20% 的折扣。每个订阅计划都包括访问 Midjourney 图库、官方 Discord、一般商业使用条款等。 如何订阅 使用该/subscribe命令生成指向订阅页面的个人链接。 或者,转到Mi…...

服务器上部署GPU版的milvus向量数据库
1、安装docker compose 我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址: https://github.com/docker/compose/releases sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)…...