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

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅

一、FFmpeg 简介与环境搭建
二、FFmpeg 解码详解


第一话:FFmpeg 简介与环境搭建

  • FFmpeg 探索之旅
    • 一、前言
    • 二、FFmpeg 是什么?
    • 三、简单介绍其历史背景
    • 四、为什么用 C++学习 FFmpeg?
      • (一)高性能优势
      • (二)底层控制能力
      • (三)接口适配优良
    • 五、环境搭建
      • (一)Windows 平台
        • 下载FFmpeg
        • 配置Visual Studio项目
        • 编写测试代码
        • 运行测试
      • (二)Linux 平台
        • 更新系统和安装依赖
        • 下载FFmpeg源码
        • 配置编译选项
        • 编译FFmpeg
        • 安装FFmpeg
        • 验证安装
        • 添加FFmpeg到环境变量(可选)
        • Note
      • (三)Mac 平台
    • 六、结束


一、前言

在当今数字化多媒体蓬勃发展的时代,音频和视频内容充斥着我们生活的方方面面。从在线视频平台的海量影视资源,到社交媒体上的短视频分享,再到各种专业视频制作与编辑工作,多媒体处理技术变得愈发重要。而 FFmpeg 作为一款功能强大且开源的多媒体处理工具库,犹如一把万能钥匙,能够开启多媒体处理的各种可能性。无论是专业的软件开发人员,还是对多媒体处理感兴趣的爱好者,深入学习 FFmpeg 都将为他们在这个领域的探索和创新提供坚实的基础。本章节将带您走进 FFmpeg 的世界,详细介绍它的基本概念,并引导您完成环境搭建,为后续深入学习其丰富的功能和应用做好充分准备。

二、FFmpeg 是什么?

  FFmpeg 是一款在多媒体处理领域极具影响力的开源工具库。自诞生以来,它经历了不断的发展与演进,在 FFmpeg 5.0 及后续版本中,其功能更是得到了进一步的强化与拓展。它能够处理各种各样的音频和视频任务,涵盖了编码、解码、转码以及滤镜处理等多个关键方面。

  在编码方面,FFmpeg 支持众多先进的编码标准,无论是广泛应用的 H.264、H.265 视频编码,还是 AAC、MP3 等音频编码格式,它都能高效处理。这意味着您可以利用它将原始音频或视频数据按照特定的编码标准进行压缩,以便于存储或在不同网络环境下传输。例如,在制作在线视频课程时,使用 FFmpeg 将高清视频编码为适合网络播放的格式,既能保证视频质量,又能减少带宽占用,提升用户观看体验。

  解码功能同样强大,它能够读取各种编码格式的音频和视频文件,并将其解码为原始的音频样本和视频帧数据。这是后续进行音频播放、视频显示或其他处理的前提。比如,当您开发一款多媒体播放器时,FFmpeg 的解码功能可以帮助您解析市面上几乎所有常见格式的媒体文件,确保播放器的兼容性和通用性。

  转码操作则允许您在不同的音频和视频格式之间进行转换。假设您有一批 AVI 格式的视频文件,但您的设备或软件只支持 MP4 格式,FFmpeg 可以轻松地将这些 AVI 文件转换为 MP4 格式,且在转换过程中,您还可以根据需要调整视频的分辨率、帧率、音频采样率等参数,以满足不同的使用场景要求。

  滤镜处理更是 FFmpeg 的一大亮点。它提供了丰富多样的滤镜效果,如视频的模糊、锐化、色彩调整,音频的降噪、音量放大或均衡等。这些滤镜可以单独使用,也可以组合起来创造出独特的多媒体效果。例如,在制作电影特效或短视频创意内容时,通过 FFmpeg 的滤镜处理,可以为视频添加复古色调、光影特效等,提升作品的艺术感染力和视觉冲击力。

  总之,FFmpeg 以其全面而强大的功能,成为了多媒体处理领域不可或缺的利器,无论是构建大型多媒体应用平台,还是进行个人创意多媒体项目的制作,它都能提供有力的技术支持。

三、简单介绍其历史背景

  FFmpeg 项目的起源可以追溯到 2000 年左右,在这二十多年的漫长历程中,它始终保持着活跃的发展态势。最初,它只是少数开发者眼中的一颗潜力种子,但随着时间的推移,越来越多的开发者和爱好者被其吸引,纷纷加入到项目的贡献中来。

  在早期发展阶段,FFmpeg 主要致力于解决音频和视频格式兼容性的基本问题,逐步建立起了对一些主流格式的初步支持框架。随着技术的不断进步和多媒体行业的快速发展,它开始不断引入新的编码算法和处理技术,以适应日益增长的高清视频、多声道音频等复杂多媒体内容的处理需求。

  进入到 FFmpeg 5.0 时代,它在性能优化、对新格式和新特性的支持方面取得了显著的突破。在性能方面,通过算法改进和代码优化,大大提高了编码和解码的速度,降低了资源占用率。例如,在处理 4K 甚至 8K 超高清视频时,相较于以往版本,处理效率有了明显的提升,使得在普通计算机上也能够较为流畅地进行这些高分辨率视频的处理工作。

  在格式支持上,FFmpeg 5.0 紧跟行业潮流,及时添加了对新兴视频格式和音频格式的支持,如一些新的网络流媒体格式以及专业音频制作领域的特殊格式。同时,它还在滤镜处理方面进行了创新,新增了更多高级滤镜效果和更灵活的滤镜组合方式,为多媒体创作者提供了更广阔的创意空间。

  多年来,FFmpeg 的影响力不断扩大,不仅在开源社区中拥有极高的知名度和活跃度,而且被广泛应用于众多商业软件和互联网服务中。从知名的视频编辑软件到大型的视频直播平台,从专业的音频处理工具到普通用户使用的多媒体播放器,FFmpeg 的身影无处不在,成为了推动多媒体技术发展和普及的重要力量。

四、为什么用 C++学习 FFmpeg?

(一)高性能优势

  C++语言以其卓越的性能和高效的资源管理能力而闻名。在多媒体处理领域,尤其是涉及到 FFmpeg 这样复杂的工具库时,高性能是至关重要的。FFmpeg 5.0 及后续版本在处理多媒体数据时,往往需要应对大规模的数据量和复杂的处理逻辑。C++能够直接对计算机硬件资源进行精细的控制,例如对内存的精准分配和管理。在处理高清视频或多声道音频数据时,C++可以确保数据在内存中的存储和读取效率达到最优,避免因内存管理不善而导致的性能瓶颈或数据错误。它还能够充分利用 CPU 的多核特性,通过多线程编程将复杂的多媒体处理任务进行合理分解,并行处理,从而显著提高处理速度。例如,在视频编码过程中,不同的线程可以分别负责图像的预处理、编码计算和数据输出等环节,大大缩短了编码所需的时间,使 FFmpeg 在处理高分辨率、高帧率视频时能够展现出出色的性能表现。

(二)底层控制能力

  C++具有强大的底层控制能力,这使得它与 FFmpeg 的结合更加紧密和高效。在多媒体处理中,经常需要与底层硬件设备进行交互,以实现最佳的音频播放和视频显示效果。C++可以直接调用操作系统提供的底层接口和驱动程序,对硬件设备进行精确的设置和控制。例如,在播放音频时,C++代码可以利用 FFmpeg 解码音频数据后,通过底层音频接口直接设置声卡的参数,如采样率、声道模式等,确保音频能够以最佳的质量输出。对于视频显示,C++可以与显卡驱动紧密配合,控制视频的渲染模式、分辨率切换等操作,充分发挥显卡的硬件加速功能,提高视频播放的流畅性和画质表现。这种底层控制能力使得开发者能够根据具体的应用需求和硬件环境,对多媒体处理过程进行深度优化,实现更高级的功能和更好的用户体验。

(三)接口适配优良

  FFmpeg 的接口设计风格与 C 和 C++高度兼容,这为使用 C++学习和应用 FFmpeg 带来了极大的便利。FFmpeg 5.0 及后续版本的函数库依然保持着这种良好的兼容性,其丰富的接口函数以 C 或 C++风格呈现。C++代码可以自然流畅地调用 FFmpeg 的各类接口,轻松实现各种多媒体处理任务。例如,在进行视频解码时,C++程序只需简单地包含 FFmpeg 的相关头文件,如<libavcodec/avcodec.h>,然后就可以直接调用avcodec_decode_video2等函数进行视频解码操作,传入相应的参数,如编码上下文、AVPacket 数据等,即可获取解码后的视频帧数据,整个过程简洁明了,代码可读性强。这种良好的接口适配性大大降低了开发难度,减少了因接口不兼容而导致的错误和调试时间,使开发者能够将更多的精力集中在多媒体处理逻辑的实现和优化上,提高开发效率和项目质量。

五、环境搭建

(一)Windows 平台

下载FFmpeg
  • 前往FFmpeg官方网站,找到Windows版本的FFmpeg。如:
    在这里插入图片描述

  • 下载完成后,将FFmpeg解压到指定的目录,例如E:\pro\ffmpeg_vs\third_party

配置Visual Studio项目
  • 打开Visual Studio,创建一个新的C++项目或打开现有的项目。

  • 在项目属性中进行配置:

    • 右键点击项目名称,选择“属性”。
    • 在“VC++目录”下的“包含目录”中,添加FFmpeg的include目录路径,如E:\pro\ffmpeg_vs\third_party\include
    • 在“库目录”中,添加FFmpeg的lib目录路径,如E:\pro\ffmpeg_vs\third_party\lib
      在这里插入图片描述
  • 在“链接器”下的“输入”选项中,在“附加依赖项”里添加FFmpeg的库文件,如avcodec.libavformat.libavutil.lib等,根据实际使用的FFmpeg功能添加相应的库。

编写测试代码
  • 在项目的源文件中编写测试代码,例如:
#include <iostream>
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
}int main() {std::cout << "FFmpeg version: " << av_version_info() << std::endl;return 0;
}
  • 这段代码用于输出FFmpeg的版本信息。
运行测试
  • 点击Visual Studio的“调试”或“运行”按钮,编译并运行项目。
  • 如果控制台输出了FFmpeg的版本信息,说明环境搭建成功,可以开始在Visual Studio中使用FFmpeg进行更复杂的音视频编程开发了。
    在这里插入图片描述

(二)Linux 平台

在Ubuntu 18.04系统上编译安装FFmpeg,可以按照以下步骤进行操作。这些步骤确保你从源代码编译FFmpeg,从而获得最多的功能支持和优化。

更新系统和安装依赖

运行以下命令,更新系统并安装编译FFmpeg所需的依赖项:

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential yasm nasm cmake git wget pkg-config libtool \libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev \libopus-dev libass-dev libfreetype6-dev libfontconfig1-dev

这些依赖项包含了FFmpeg常用的编码器(如x264、x265、VPX)和工具。


下载FFmpeg源码

从FFmpeg的官网获取源码:

https://ffmpeg.org/security.htmlcd ffmpeg

进入官网下载ffmpeg源代码在这里插入图片描述

然后将下载的源码进行解压,然后进入解压后的ffmpeg目录。

配置编译选项

在FFmpeg源码目录中,运行以下命令配置FFmpeg的编译选项:

./configure --prefix=/home/cc/ffmpeg --enable-gpl --enable-nonfree --enable-libx264  --enable-libx265 --enable-libvpx --enable-libfdk-aac --enable-libmp3lame  --enable-libopus --enable-libass --enable-libfreetype --enable-libfontconfig   --enable-shared --enable-static

这里的选项说明:

  • --prefix=/usr/local:安装FFmpeg到/home/cc/ffmpeg目录。
  • --enable-gpl:启用GPL许可证代码(如x264)。
  • --enable-nonfree:启用非自由组件(如libfdk-aac)。
  • --enable-libx264--enable-libx265 等:启用对应的编码库。

编译FFmpeg

运行以下命令编译FFmpeg:

make -j$(nproc)
  • -j$(nproc):使用所有可用CPU核心加速编译。

编译可能需要几分钟到十几分钟,取决于你的系统性能。

安装FFmpeg

编译完成后,运行以下命令将FFmpeg安装到对应位置:

make install
验证安装

运行以下命令确认FFmpeg安装成功:

ffmpeg -version

你应该能看到类似以下的输出,显示FFmpeg版本及其支持的编码器:

添加FFmpeg到环境变量(可选)

如果ffmpeg命令未被自动识别,可以将FFmpeg的路径添加到系统的环境变量中:

  1. 编辑~/.bashrc文件:

    nano ~/.bashrc
    
  2. 在文件末尾添加以下内容:

    export PATH="/usr/local/bin:$PATH"
    
  3. 保存并生效:

    source ~/.bashrc
    
Note
  • 如果需要支持更多的库或功能,可以在./configure命令中添加相应的选项。
  • 如果遇到依赖错误,检查是否缺少必要的开发库,并安装它们。

完成以上步骤后,你将拥有一个功能全面、通过源码编译的FFmpeg版本。

(三)Mac 平台

后续补充...

六、结束

  通过本章的学习,我们对 FFmpeg 有了初步的认识,了解了它在多媒体处理领域的重要地位和强大功能,同时也掌握了在不同操作系统下搭建 FFmpeg 开发环境的方法。这为我们后续深入学习 FFmpeg 的各种高级功能和应用场景奠定了坚实的基础。在接下来的章节中,我们将进一步探索 FFmpeg 的基础数据结构与 API 的详细使用方法,逐步揭开 FFmpeg 更多的神秘面纱,让您能够更加熟练地运用它来处理各种多媒体任务,无论是开发专业的多媒体应用程序,还是进行个人创意多媒体项目的创作,都能游刃有余。希望您在 FFmpeg 的学习之旅中不断收获知识和乐趣,开启属于自己的多媒体处理精彩篇章。

相关文章:

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话&#xff1a;FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么&#xff1f;三、简单介绍其历史背景四、为什么用 C学习 FFmpeg&#xff1f;&#xff08;一&#xff09;高性能优势&#…...

C++并发编程: std::atomic对指针进行操作

std::atomic 对指针进行运算的用途 std::atomic 提供了一种在多线程环境中安全地操作指针的方法。这对于实现线程安全的指针管理、动态内存分配、链表操作等场景非常有用。通过使用std::atomic对指针进行运算&#xff0c;可以确保指针操作的原子性和多线程安全性。 常见用途 …...

工业大数据分析算法实战-day08

文章目录 day08模型评价聚类算法基于距离的聚类基于层次的聚类基于密度的聚类基于分布的聚类聚类结果的评价 day08 今天是第8天&#xff0c;昨日阐述了概率图模型和集成学习的分类&#xff0c;主要讲解了有向图和无向图&#xff0c;生成式模型和判断式模型&#xff0c;以及集成…...

在 C# 中实现的目录基础操作

前言 在开发应用程序过程中&#xff0c;对操作系统上的文件夹存储文件和子文件夹操作是常见的需求。.NET中的Directory类提供了处理文件目录的功能。本文介绍如何读取文件夹的属性、获取文件夹的大小及文件个数、创建文件夹、遍历文件夹中的所有文件、移动文件夹和删除文件夹等…...

​Python 标识符是啥?​

Python 的标识符就是我们写代码时用来给变量、函数、类等取名字的东西。 你写的 my_variable 是个标识符&#xff0c; 定义的 add_numbers 函数名也是个标识符&#xff0c; 甚至你写的 Cat 类名&#xff0c;也是标识符。 一句话总结&#xff1a;标识符就是代码里给“东西”起…...

WEB开发: 全栈工程师起步 - Python Flask +SQLite的管理系统实现

一、前言 罗马不是一天建成的。 每个全栈工程师都是从HELLO WORLD 起步的。 之前我们分别用NODE.JS 、ASP.NET Core 这两个框架实现过基于WebServer的全栈工程师入门教程。 今天我们用更简单的来实现&#xff1a; Python。 我们将用Python来实现一个学生管理应用&#xff0…...

将 Matplotlib 图形转换为 PIL 图像并返回

将 Matplotlib 图形转换为 PIL 图像并返回 前言完整代码Matplotlib 中 fig 和 ax 的关系示例&#xff1a; 问题分析常见错误及解决方案总结 前言 Matplotlib 是 Python 里最流行的图表展示库&#xff0c;PIL (Python Imaging Library)则是一个强大的图像处理库。在开发过程中&…...

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…...

点焊机器人维修-ABB-KUKA-FANUC-YASKAWA

在正式启用点焊机器人之前&#xff0c;一项至关重要的预备步骤便是进行焊枪的全面设置操作。以FANUC机器人为例&#xff0c;其焊枪的设置流程涵盖了多个关键环节&#xff0c;如焊枪运动方向的精确规划、焊枪规格的选择以及零点标定的细致执行等。这些设置均须严格依据实际所采用…...

springboot448教学辅助系统(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…...

网络地址转换(NAT)和端口映射

1. 网络地址转换(NAT) 1.1 NAT的应用场景 &#xff08;1&#xff09;应用场景&#xff1a;允许将私有IP地址映射到公网地址&#xff0c;以减缓IP地址空间的消耗 ①需要连接Internet&#xff0c;但主机没有公网IP地址 ②更换了一个新的ISP&#xff0c;需要重新组织网络时&…...

iClent3D for Cesium 实现无人机巡检飞行效果

作者&#xff1a;gaogy 1、背景 随着地理信息技术的发展&#xff0c;三维地球技术逐渐成为了许多领域中的核心工具&#xff0c;尤其是在城市规划、环境监测、航空航天以及军事领域。三维地图和场景的应用正在帮助人们更加直观地理解空间数据&#xff0c;提供更高效的决策支持。…...

后端- spring cache框架操作缓存数据(底层可以是redis,也可以是caffeine和ehcache)

...

低比特语言模型 是一种利用较少比特数进行语言建模的技术

Vanilla LLM: 基础的全精度语言模型&#xff0c;通常在较高比特数下运作 Vanilla LLM&#xff0c;或称为“基础的全精度语言模型”&#xff0c;是指使用标准的浮点数&#xff08;通常是16位或32位&#xff09;进行训练和推理的语言模型。这些模型依赖于经典的神经网络结构&…...

ES6中的map和set

Set ES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复的值。 Set本身是一个构造函数&#xff0c;用来生成 Set 数据结构。 以下代码 const s new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x > s.add(x));for (let i of s…...

【WRF安装】WRF编译错误总结1:HDF5库包安装

目录 1 HDF5库包安装有误&#xff1a;HDF5 not set in environment. Will configure WRF for use without.HDF5的重新编译 错误原因1&#xff1a;提示 overflow 错误1. 检查系统是否缺少依赖库或工具2. 检查和更新编译器版本3. 检查 ./configure 报错信息4. 检查系统环境变量5.…...

MyBatis常见面试题总结

#{} 和 ${} 的区别是什么&#xff1f; 注&#xff1a;这道题是面试官面试我同事的。 答&#xff1a; ${}是 Properties 文件中的变量占位符&#xff0c;它可以用于标签属性值和 sql 内部&#xff0c;属于原样文本替换&#xff0c;可以替换任意内容&#xff0c;比如${driver}…...

Qt生成随机数的方法

后台接口要求传个流水单号&#xff0c;流水号的格式是&#xff1a;“设备序列号”“设备MAC地址”“20位的随机数”。 具体的是&#xff1a; “设备序列号”&#xff1a;就是烧录工具写入设备的序列编号&#xff0c;这就不多说了&#xff0c;读出来就行&#xff1b; “设备MAC地…...

深入探索Vue.js中的v-if指令:条件渲染的高级技巧

深入探索Vue.js中的v-if指令&#xff1a;条件渲染的高级技巧 引言 在现代Web开发中&#xff0c;根据条件动态地渲染或移除DOM元素是一个常见的需求。Vue.js提供了一种简洁而强大的方法来实现这一目标&#xff0c;即通过v-if指令来根据表达式的值来控制元素的渲染。本文将详细…...

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…...

NTLMv2 离线爆破

攻击者&#xff08;kali&#xff09;&#xff1a;192.168.72.162 受害者&#xff08;administrator&#xff09;&#xff1a;192.168.72.163 因为 NTLM 身份验证是通过计算正确的挑战值得出的&#xff0c;所以如果我们能获取域用户的 NTLM 认证某一服务的 Net-NTLM v2 Hash …...

LabVIEW实现RFID通信

目录 1、RFID通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

【Three.js基础学习】31.Lights Shading

前言 关于灯光如何在着色器中应用&#xff01; 下面将创建三个灯光 分别是点光源&#xff0c;环境光&#xff0c;方向光通过这几种光应用着色器显示对应阴影 学习灯光阴影&#xff0c;着色器的使用 添加三盏灯 点光&#xff0c;方向光&#xff0c;环境光 创建一个环境光 在现…...

Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置

目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...

IDEA搭建springboot demo

如下所示创建SpringBootTest18项目&#xff0c;我选的maven&#xff0c;创建完成项目后&#xff0c;maven会自动下载一些依赖库到maven的repository目录中。 创建的项目结构如下图所示 接下来在项目中加入Framework支持&#xff0c;右击项目&#xff0c;弹出的菜单如下图所示&a…...

SQLite Update 语句

SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句&#xff0c;您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句&#xff0c;包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…...

node.js的简单示例

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于方便地构建快速、可扩展的网络应用。下面是一个简单的Node.js示例&#xff0c;它创建了一个简单的HTTP服务器&#xff0c;当访问服务器时&#xff0c;它会响应“Hello World” // 引入Node.js的HTTP模块…...

fpga系列 HDL:Quartus II 时序约束 静态时序分析 (STA) test.out.sdc的文件结构

test.out.sdc的文件结构 ## Generated SDC file "test.out.sdc"## Copyright (C) 1991-2013 Altera Corporation ## Your use of Altera Corporations design tools, logic functions ## and other software and tools, and its AMPP partner logic ## functions,…...

Restaurants WebAPI(一)—— clean architecture

文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...

A Unified Framework for STAR-RIS Coefficients Optimization

文章目录 AbstractB. A Penalty-based Reformulation of (1) III. OPTIMIZING AUXILIARY VARIABLES φ \boldsymbol φ φ IN P1IV. A CASE STUDY OF P2 ON DOWNLINK STAR-RIS ASSISTED TRANSMISSION SYSTEMA. 优化 x , ρ , w , λ t x, \rho, \mathbf{w}, \lambda^t x,ρ,w…...

rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别

在Git版本控制系统中&#xff0c;rebase 和 merge 是两种不同的操作&#xff0c;用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起&#xff0c;但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…...

谷歌发布最新视频生成模型 Veo 2:视频生成AI新王牌

谷歌 在当今数字化快速发展的时代&#xff0c;人工智能视频生成技术正不断突破创新。就在12月17日&#xff0c;谷歌推出了一个新的视频模型 Veo 2 。 Veo 2 Veo 2 Veo 2 可以创建各种主题和风格的高质量视频。在谷歌官方由人工评估员判断中&#xff0c;Veo 2 与领先模型相比取得…...

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…...

基于Docker的Minio分布式集群实践

目录 1. 说明 2. 配置表 3. 步骤 3.1 放行服务端口 3.2 docker-compose 编排 4. 入口反向代理与负载均衡配置 4.1 api入口 4.2 管理入口 5. 用例 6. 参考 1. 说明 以多节点的Docker容器方式实现minio存储集群&#xff0c;并配以nginx反向代理及负载均衡作为访问入口。…...

解决node.js的req.body为空的问题

从昨晚一直在试&#xff0c;明明之前用的封装的axios发送请求给其他的后端&#xff08;springboot&#xff09;是可以的&#xff0c;但昨天用了新项目的后端&#xff08;node.js&#xff09;就不行。 之前用了代理&#xff0c;所以浏览器发送的post请求不会被拦截&#xff0c;…...

数据结构期末算法复习:树、查找、排序

一、树 1.二叉链-定义 typedef struct BiTNode{ ElemType data;//数据域 struct BiTNode *lchild ,*rchild;//左、右孩子指针 }BiTNode , *BiTree ;2.查找值为x的结点 BTNode FindNode(BTNode b&#xff0c;ElemType x) { BTNode *p;if (bNULL) return NULL;else if (…...

复习打卡Linux篇

目录 1. Linux常用操作命令 2. vim编辑器 3. 用户权限 4. Linux系统信息查看 1. Linux常用操作命令 基础操作&#xff1a; 命令说明history查看历史执行命令ls查看指定目录下内容ls -a查看所有文件 包括隐藏文件ls -l ll查看文件详细信息&#xff0c;包括权限类型时间大小…...

OpenAI API深度解析:参数、Token、计费与多种调用方式

随着人工智能技术的飞速发展&#xff0c;OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式&#xff0c;以及如何通过Rest API&#xff08;以Postman为例&#xff09;、Java API调用、工具调用等方式实现与OpenAI的交互&#xff0…...

Centos7 部署ZLMediakit

1、拉取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 2、安装编译器 sudo yum -y install gcc 3、安装cmake sudo yum -y install cmake 4…...

python:用 sklearn.metrics 评价 K-Means 聚类模型

sklearn 的 metrics 模块提供的聚类模型评价指标如下&#xff1a; ARI 评价法&#xff08;兰德系数&#xff09;: adjusted_rand_score AMI 评价法&#xff08;相互信息&#xff09;: adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…...

谁说C比C++快?

看到这个问题&#xff0c;我我得说&#xff1a;这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子&#xff1a; // C风格 char* str (char*)malloc(100…...

算法刷题Day23:BM60 括号生成

题目链接 描述&#xff1a;给出n对括号&#xff0c;请编写一个函数来生成所有的由n对括号组成的合法组合。 例如&#xff0c;给出n3&#xff0c;解集为&#xff1a; “((()))”, “(()())”, “(())()”, “()()()”, “()(())” 思路&#xff1a; 回溯左子树不断添加‘&#…...

基于Redis实现令牌桶算法

基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制&#xff08;流量不均匀或变化的衡量标准&#xff09;。它还可以用作调度算…...

XXE练习

pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…...

Mac上使用ln指令创建软链接、硬链接

在Mac、Linux和Unix系统中&#xff0c;软连接&#xff08;Symbolic Link&#xff09;和硬连接&#xff08;Hard Link&#xff09;是两种不同的文件链接方式。它们的主要区别如下&#xff1a; 区别&#xff1a; 硬连接&#xff1a; 不能跨文件系统。不能链接目录&#xff08;为…...

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架&#xff0c;适用于&#xff1a;单元测试、Web自动…...

JAVA没有搞头了吗?

前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津&#xff0c;难得的面试机会也难以把握&#xff0c;即便成功入职&#xff0c;也往往难以长久。于是&#xff0c;不少程序员感叹&#xff1a;互联网的寒冬似乎又一次卷土重来&#xff0c;环境如此恶劣&…...

ECharts 饼图:数据可视化的重要工具

ECharts 饼图:数据可视化的重要工具 引言 在数据分析和可视化的领域,ECharts 是一个广受欢迎的开源库。它由百度团队开发,用于在网页中创建交互式图表。ECharts 提供了多种图表类型,包括柱状图、折线图、散点图等,而饼图则是其中最常用的一种。本文将深入探讨 ECharts 饼…...

arcGIS使用笔记(无人机tif合并、导出、去除黑边、重采样)

无人机航拍建图之后&#xff0c;通过大疆智图软件可以对所飞行的区域的进行拼图&#xff0c;但是如果需要对拼好的图再次合并&#xff0c;则需要利用到arcGIS软件。下面介绍arcGIS软件在这个过程中常用的操作。 1.导入tif文件并显示的方法&#xff1a;点击“”图标进行导入操作…...

0 前言

ArCS作为一个基于Rust的CAD&#xff08;计算机辅助设计&#xff09;开源系统&#xff0c;尽管已经有四年未更新&#xff0c;但其设计理念和技术实现仍然具有很高的学习和参考价值。以下是对ArCS项目的进一步分析和解读&#xff1a; 一、项目亮点与技术优势 高效与安全的Rust语…...