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

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg

FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架!

官方网址:https://ffmpeg.org/

FFmpeg 的主要特点和功能:

  1. 编解码器支持: FFmpeg 支持众多音视频编解码器,包括常见的 H.264、H.265、AAC、MP3 等,也支持一些不常见的编解码器。
  2. 格式支持: 它支持多种多媒体格式的解析和封装,包括 AVI、MP4、MKV、FLV、MOV 等。
  3. 转码和处理: FFmpeg 可以进行音视频的转码、裁剪、拼接、水印添加等处理操作,使其在不同格式、分辨率和编码方式之间进行转换。
  4. 流媒体处理: 它支持从摄像头、文件或网络流等源接收多媒体流,并能进行实时处理和转发,用于流媒体直播和视频会议等场景。
  5. 滤镜和特效: FFmpeg 提供了丰富的滤镜和特效,可以实现图像处理、色彩调整、模糊、锐化等效果。
  6. 音频处理: 它能够进行音频的分割、合并、音量调整、混音等操作。
  7. 跨平台性: FFmpeg 是跨平台的,可以在 Windows、MacOS、Linux 等操作系统上运行。
  8. 开源和免费: FFmpeg 是完全开源的,可以免费使用,并且具有活跃的社区支持和持续的更新和改进。

1.1 安装FFmpeg

在 Ubuntu 上安装 FFmpeg 可以通过包管理器 apt 来完成。以下是在 Ubuntu 上安装 FFmpeg 的步骤:

  1. 更新软件包列表
sudo apt update
  1. 安装 FFmpeg
sudo apt install ffmpeg -y

安装完成后,你可以通过以下命令验证是否成功安装了 FFmpeg:

ffmpeg -version

如需安装FFmpeg拓展开发包可执行如下所示命令:

sudo apt install libavcodec-dev -y
sudo apt install libavformat-dev -y
sudo apt install libavcodec-extra -y

FFmpeg开发文档:https://ffmpeg.org/ffmpeg.html

1.2 使用命令行执行ffmpeg

转换视频格式

ffmpeg -i input.mp4 output.avi

这个命令将输入的 MP4 文件转换为 AVI 格式。

合并视频和音频

ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

这个命令将一个视频文件和一个音频文件合并为一个 MP4 文件,视频流不变,音频流重新编码为 AAC 格式。

调整视频大小

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

这个命令将输入的 MP4 文件调整为 1280x720 分辨率的输出。

改变视频帧率

ffmpeg -i input.mp4 -r 24 output.mp4

这个命令将输入的 MP4 文件的帧率改为 24 帧每秒。

提取视频中的帧

ffmpeg -i input.mp4 -vf "select=eq(n\,100)" -vsync vfr output.png

这个命令将从输入的 MP4 文件中提取第 100 帧,并将其保存为 PNG 图像文件。

添加水印

ffmpeg -i input.mp4 -i test.jpg -filter_complex "overlay=10:10" output.mp4

这个命令将一个水印图像叠加到输入的 MP4 文件的左上角。

1.3 代码实现视频格式转换

C++代码实现MP4视频格式转换AVI,程序主要内容如下图所示:

1.4 FFmpeg核心库介绍

2.GStreamer

GStreamer 是一个功能强大的开源多媒体框架,用于创建、处理和播放音频和视频流。官方网址:GStreamer: open source multimedia framework

  1. 模块化架构: GStreamer 的设计是基于模块化的架构,可以根据需要添加或移除各种插件和元件,从而实现灵活的功能扩展和定制。
  2. 跨平台性: GStreamer 可以在多种操作系统上运行,包括 Linux、Windows、macOS 等。
  3. 丰富的插件支持: GStreamer 提供了大量的插件,用于处理各种多媒体格式、编解码器、滤镜、特效等,可以满足各种多媒体处理需求。
  4. 流式处理: GStreamer 支持流式处理,可以处理实时音视频流,适用于流媒体直播、视频会议等场景。
  5. 音视频编解码支持: 它支持多种常见的音视频编解码器,包括 H.264、H.265、AAC、MP3 等,也支持一些不常见的编解码器。
  6. 容器格式支持: GStreamer 支持多种多媒体容器格式的解析和封装,包括 AVI、MP4、MKV、FLV、MOV 等。
  7. 图形界面和命令行工具: GStreamer 提供了图形界面和命令行工具,用于配置和管理多媒体处理流程。
  8. 多语言支持: GStreamer 可以通过各种语言的绑定进行使用,包括 C、C++、Python、Java 等。

GStreamer的核心是基于管道(Pipeline)的概念,这意味着你可以将多个处理步骤(称为元素或Element)连接起来,以实现复杂的媒体处理任务。

2.1 安装GStreamer

  1. 更新软件包列表

    在终端中执行以下命令,确保系统的软件包列表是最新的:

    sudo apt update
    
  2. 安装 GStreamer

    安装 GStreamer 的基本运行时库和插件。你可以根据需要选择不同的插件包,如 gstreamer1.0-plugins-basegstreamer1.0-plugins-goodgstreamer1.0-plugins-bad 和 gstreamer1.0-plugins-ugly

    sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio -y
    

    这些插件包括了各种常见的音视频编解码器、文件格式支持以及其他的功能扩展。

  3. 安装额外的 GStreamer 插件(可选):

    如果你需要更多特定功能的插件,你可以根据需要安装额外的插件包。例如,如果你需要使用 GStreamer 的 Python 绑定,可以安装 gir1.2-gst-plugins-base-1.0 包。

    sudo apt install gir1.2-gst-plugins-base-1.0
    
  4. 验证安装

    安装完成后,你可以通过运行以下命令来验证 GStreamer 是否正确安装:

    gst-inspect-1.0 --version
    

    这将显示 GStreamer 版本信息。

GStreamer开发文档:https://gstreamer.freedesktop.org/documentation

2.2 使用命令行执行

转换视频格式

gst-launch-1.0 -e filesrc location=input.mp4 ! qtdemux name=demux \demux.video_0 ! queue ! decodebin ! videoconvert ! \avenc_mpeg4 ! matroskamux name=mux \demux.audio_0 ! queue ! decodebin ! audioconvert ! \audioresample ! audioconvert ! mux. \mux. ! filesink location=output.mkv

这个命令将输入的 MP4 文件转换为 MKV格式。

合并视频和音频

gst-launch-1.0 -e filesrc location=video.mp4 ! qtdemux name=demux \
demux.video_0 ! queue ! h264parse ! mux. \
filesrc location=audio.mp3 ! decodebin ! audioconvert ! voaacenc ! aacparse ! mux. \
qtmux name=mux ! filesink location=output.mp4

这个命令将一个视频文件和一个音频文件合并为一个 MP4 文件,视频流不变,音频流重新编码为 AAC 格式。

调整视频大小

gst-launch-1.0 filesrc location=input.mp4 ! decodebin ! videoscale ! video/x-raw,width=1280,height=720 ! videoconvert ! x264enc ! mp4mux ! filesink location=output.mp4

这个命令将输入的 MP4 文件调整为 1280x720 分辨率的输出。

改变视频帧率

gst-launch-1.0 filesrc location=input.mp4 ! decodebin ! videorate ! video/x-raw,framerate=24/1 ! videoconvert ! x264enc ! mp4mux ! filesink location=output.mp4

这个命令将输入的 MP4 文件的帧率改为 24 帧每秒。

提取视频中的帧

gst-launch-1.0 filesrc location=input.mp4 ! qtdemux ! decodebin ! videorate ! video/x-raw,framerate=1/1 ! videoconvert ! pngenc ! filesink location=output.png

这个命令将从输入的 MP4 文件中提取视频中的图像,并保存为 PNG 图像文件。

视频叠加文字

gst-launch-1.0 filesrc location=input.mp4 ! decodebin ! videoconvert ! textoverlay text="Hello, World!" valignment=top halignment=left ! x264enc ! mp4mux ! filesink location=output.mp4

这个命令将从输入的 MP4 视频上叠加文字并将结果保存到输出文件中。

2.3 第一个GStreamer 应用程序

C代码实现MP4文件的播放,程序主要内容如下图所示:

编译运行程序后,可以看到程序会读取指定路径下的文件并弹出一个窗口播放视频:

$ ls
basic-tutorial input.mp4 main.c
$ ./basic-tutoria

Copy

She

2.4 创建并连接管道

C代码实现创建元素并将元素相互连接,程序主要内容如下图所示:

编译运行程序后,可以看到程序会读取指定路径下的文件并弹出一个窗口播放默认视频:

$ ls
concepts-tutorial  main.c
$ ./concepts-tutorial

Copy

She

3.DirectShow

Microsoft® DirectShow® 是 Microsoft Windows® 平台上流媒体的体系结构。 DirectShow 提供多媒体流的高质量捕获和播放。 它支持多种格式,包括高级系统格式 (ASF) 、电影专家组 (MPEG) 、Audio-Video交错 (AVI) 、MPEG 音频层 3 (MP3) 和 WAV 声音文件。 它支持基于 Windows 驱动程序模型 (WDM) 或视频从数字和模拟设备捕获。 它会自动检测并使用视频和音频加速硬件(如果可用),但也支持没有加速硬件的系统。

3.1 架构

按照功能来分,Filter 大致分为三类:Source Filters、Transform Filters 和 Rendering Filters。

  • Source Filters 主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据往下传输;
  • Transform Fitlers 主要负责数据的格式转换、传输;
  • Rendering Filtes 主要负责数据的最终去向,我们可以将数据送给声卡、显卡进行多媒体的演示,也可以输出到文件进行存储。

在 DirectShow 系统上,我们看到的,即是我们的应用程序(Application)。应用程序要按照一定的意图建立起相应的 Filter Graph,然后通过 Filter Graph Manager 来控制整个的数据处理过程。DirectShow 能在 Filter Graph 运行的时候接收到各种事件,并通过消息的方式发送到我们的应用程序。这样,就实现了应用程序与 DirectShow 系统之间的交互。

现对于面向 Windows 7 或更高版本的 DirectX,是集成在Windows SDK里,感兴趣的同学可自行尝试安装与学习。

Windows SDK下载地址:Windows SDK和模拟器存档 | Microsoft Developer

DirectShow开发文档:DirectShow - Win32 apps | Microsoft Learn

3.2 分析AVI视频播放程序

在 DirectShow 中,应用程序通过将筛选器链连接在一起来执行任何任务,以便一个筛选器的输出成为另一个筛选器的输入。 一组连接的筛选器称为 筛选器图。 例如,下图显示了用于播放 AVI 文件的筛选器图。

代码地址:如何播放文件 - Win32 apps | Microsoft Learn

代码实现AVI文件的播放,程序主要内容如下图所示:

上面的程序演示了DirectShow的基本用法,包括初始化COM库(DirectShow 库)、创建过滤器图形、播放视频文件以及资源的释放。

4.AVFoundation

AVFoundation 是苹果开发的一个全功能框架,用于在iOS、macOS、watchOS和tvOS上处理基于时间的音视频媒体。使用AVFoundation,您可以轻松播放、创建和编辑QuickTime电影和MPEG-4文件,播放HLS流,并在您的应用中构建强大的媒体功能。

它是Objective-C/Swift接口的一部分,允许开发者在详细级别上处理基于时间的音视频数据。例如,您可以使用AVFoundation来检查、创建、编辑或重新编码媒体文件。它还允许从设备获取输入流,并在实时捕捉和回放过程中操作视频。

AVFoundation 官方网址:AVFoundation Overview - Apple Developer

4.1 核心框架

Core Animation 是 iOS 和 OS X 上提供的图形渲染和动画基础架构,可用于对 App 的视图和其他视觉元素进行动画处理。使用 Core Animation,绘制动画每一帧所需的大部分工作都为您完成。您所要做的就是配置一些动画参数(例如起点和终点)并告诉 Core Animation 开始。Core Animation 将完成剩下的工作,将大部分实际绘图工作交给板载图形硬件以加速渲染。这种自动图形加速可实现高帧率和流畅的动画,而不会增加 CPU 负担并降低应用程序速度。

如果您使用AVFoundation进行开发,可以从Mac App Store下载并安装最新版本的Xcode,感兴趣的同学可自行尝试安装与学习

4.2 分析MOV视频播放程序

代码地址:AVFoundationSimplePlayer-iOS:使用 AVFoundation 播放媒体 (apple.com)

代码实现MOV文件的播放,程序主要内容如下图所示:

AVFoundation框架通过创建和配置AVPlayer(播放器)及其关联的AVPlayerLayer(视频图层)来播放MOV文件,实现了媒体资源的加载、管理和用户界面展示的整合。

5.OpenMAX

5.1背景

随着消费者对智能手机、音频和视频媒体播放器和游戏机等平台上的视频、音频、语音和3D等应用程序的功能改进需求的增长,多媒体硬件平台的开发步伐正在加快。一般来说,这类产品需要高性能的处理和高数据吞吐能力。因此,出现了各种解决方案,每个解决方案都旨在加快多媒体应用的速度。示例包括:

  • 具有特定多媒体扩展的通用处理器
  • 低级硬件加速器,
  • 多种处理器架构,包括 DSP

  • 专用硬件视频解码器

所有这些架构改变的主要挑战之一是开发高效的代码。尽管通常提供编译器,但很少能够从高级编程语言中挖掘整个架构的全部潜力。

结果是,应用程序的大部分内容通常是用汇编语言编写的,专门针对硬件平台。不同多媒体硬件解决方案的快速增长意味着必须针对其移植到的每个新平台重新编写和优化软件。

这种实施效率低下的后果是延迟了新产品的推出,增加了开发成本并降低了产品质量,最终在市场需求增长的时候减缓了多媒体领域的创新。

5.2 底层架构

OpenMAX AL 是多媒体应用程序(如媒体播放器)和平台媒体框架之间的接口。它允许开发应用程序的公司轻松地将其应用程序迁移到支持 OpenMAX AL 应用程序编程接口 (API) 的不同平台(客户)。

OpenMAX IL 是媒体框架(如 Android 上的 StageFright 或 MediaCodec API、Windows 上的 DirectShow、Linux 上的 FFmpeg 或 GStreamer)与一组多媒体组件(如音频或视频编解码器)之间的接口。它允许构建平台的公司(例如允许实现 MP3 播放器)轻松更改 MP3 解码器和均衡器效果等组件,并从不同供应商处为其平台购买组件。

OpenMAX DL 是物理硬件(如数字信号处理器 (DSP) 芯片、CPU、GPU 和软件(如视频编解码器和 3D 引擎)之间的接口。它允许公司轻松集成支持 OpenMAX DL 的新硬件,而无需重新优化其低级软件。

参考链接:OpenMAX AL Overview - The Khronos Group Inc

5.2.1 OpenMAX AL应用层

OpenMAX AL(Open Media Acceleration Layer)是一个用于移动设备和嵌入式系统的多媒体应用程序接口(API)。它的设计目标是提供一种统一的方式来访问移动设备上的多媒体硬件加速功能,包括音频、视频和图形处理。通过提供一致的编程接口,开发人员可以更轻松地利用设备的硬件加速功能,从而实现更高效的多媒体应用程序开发。

OpenMAX AL的主要组成部分包括:

  1. 音频对象:允许开发人员管理音频数据的播放、录制和处理。这包括音频解码、混音、音频效果处理等功能。
  2. 视频对象:提供对视频数据的处理和渲染功能,包括视频解码、视频渲染、视频效果处理等。
  3. 图像对象:用于处理图像数据,包括图像编解码、图像处理等功能。
  4. I/O对象:用于管理输入输出流,例如文件、网络流等。

OpenMAX AL通过定义一系列标准接口和功能来实现设备无关性,这使得开发人员可以编写一次代码,然后在支持OpenMAX AL的各种移动设备上运行,而无需针对特定设备进行修改。

此外,OpenMAX AL还支持异步处理,这意味着应用程序可以同时执行多个多媒体任务,从而提高了系统的性能和响应速度。

总的来说,OpenMAX AL为移动设备上的多媒体应用程序提供了一个统一的、高效的编程接口,使开发人员能够更轻松地利用设备的多媒体硬件加速功能,从而实现更好的用户体验。

参考文档:OpenMAX Application Layer 1.1 Specification (khronos.org)

5.2.2 OpenMAX IL集成层

OpenMAX IL(Integration Layer)是一种跨平台的多媒体应用程序接口标准,旨在简化多媒体应用程序的开发过程并实现跨不同硬件平台的兼容性。它由Khronos Group开发和维护,该组织也是OpenGL和Vulkan等其他图形和多媒体标准的创建者。

OpenMAX IL的设计目标是提供一个统一的接口,使开发者能够轻松地访问和控制各种硬件加速的多媒体处理功能,包括音频、视频、图像和其他多媒体数据的编解码、处理和渲染等。它为开发者提供了一组标准化的功能调用,这些调用可以用于创建和管理多媒体处理管道,从而使应用程序能够高效地利用底层硬件资源。

OpenMAX IL的主要特点和功能包括:

  1. 跨平台兼容性:OpenMAX IL被设计为跨不同硬件平台和操作系统的标准接口,使开发者能够编写具有良好可移植性的多媒体应用程序。
  2. 多媒体处理管道:OpenMAX IL提供了一种灵活的方式来构建和管理多媒体处理管道,使开发者能够将各种处理单元(例如解码器、编码器、滤镜等)组合起来以实现复杂的多媒体处理任务。
  3. 硬件加速:OpenMAX IL支持利用硬件加速功能来提高多媒体处理的性能和效率,包括使用GPU进行图像处理和使用DSP进行音频处理等。
  4. 低延迟处理:OpenMAX IL旨在实现低延迟的多媒体数据处理,使其适用于实时音视频应用程序和交互式多媒体应用程序。
  5. 灵活的配置和控制:OpenMAX IL提供了丰富的配置选项和控制接口,使开发者能够根据应用程序的需求进行定制和优化。

尽管OpenMAX IL提供了强大的功能和灵活性,但它也有一些限制和挑战,例如在不同平台上的实现可能存在差异,开发者需要考虑不同硬件和驱动程序的兼容性,并且对于初学者来说学习曲线可能较陡峭。然而,对于需要高性能多媒体处理的应用程序来说,OpenMAX IL仍然是一个重要的选择。

参考文档:The OpenMAX Integration Layer Specification (khronos.org)

5.2.3 OpenMAX DL开发层

OpenMAX DL(Development Layer)是OpenMAX标准的一部分,它提供了一组用于硬件加速的低级图像和信号处理功能的API。OpenMAX DL的目标是为多媒体应用程序提供一种标准化的接口,使它们能够利用硬件加速器来执行各种图像和信号处理任务,例如图像解码、编码、滤波、变换等。

OpenMAX DL的主要特点和功能包括:

  1. 硬件加速:OpenMAX DL旨在利用硬件加速器来执行图像和信号处理任务,以提高处理速度和效率。
  2. 低级API:OpenMAX DL提供了一组低级的图像和信号处理函数,开发者可以使用这些函数来执行各种处理任务,如图像解码、编码、滤波、变换等。
  3. 跨平台兼容性:OpenMAX DL被设计为跨不同硬件平台和操作系统的标准接口,使开发者能够编写具有良好可移植性的多媒体应用程序。
  4. 灵活性和定制性:OpenMAX DL提供了丰富的功能和配置选项,使开发者能够根据应用程序的需求进行定制和优化。
  5. 高性能:通过利用硬件加速器,OpenMAX DL能够实现高性能的图像和信号处理,适用于对处理速度要求较高的多媒体应用程序。

尽管OpenMAX DL提供了一种强大的图像和信号处理API,但它也有一些限制和挑战,例如在不同平台上的实现可能存在差异,开发者需要考虑不同硬件和驱动程序的兼容性,并且对于初学者来说学习曲线可能较陡峭。然而,对于需要高性能图像和信号处理的应用程序来说,OpenMAX DL仍然是一个重要的选择。

参考文档:omx_dl_v1_0_2 (khronos.org)

相关文章:

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...

如何移植ftp服务器到arm板子?

很多厂家提供的sdk,一般都不自带ftp服务器功能, 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk:复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…...

牛批,吾爱出品

可能是因为从事IT的原因,我身边的大多数朋友也是从事相关工作的,而IT工作往往需要长时间对着电脑。这样就很容易眼睛疲劳。今天给大家推荐几款,希望有对有需要的小伙伴有所帮助,大家可以收藏以来哦。 CareUEyes CareUEyes是一款绿…...

基于 Android 的日程管理系统的设计与实现

标题:基于 Android 的日程管理系统的设计与实现 内容:1.摘要 基于 Android 的日程管理系统旨在帮助用户更高效地管理个人日程安排。该系统采用了 Android 平台的优势,结合了简洁的界面设计和强大的功能,为用户提供了便捷的日程管理体验。 在设计与实现过…...

Kubectl 与 Helm 详解

在 Kubernetes 生态中,kubectl 和 Helm 是两个核心工具,分别用于直接管理 Kubernetes 资源和简化应用的部署与管理。本文将深入探讨 kubectl 和 Helm 的功能、使用场景、部署与更新方式,并对比它们的优缺点。 1. Kubectl 详解 1.1 什么是 Kubectl? kubectl 是 Kubernetes…...

centos搭建docker registry镜像仓库

centos搭建docker registry镜像仓库 简介 Docker Registry是一个存储和分发Docker镜像的服务。它允许用户上传、下载和管理 Docker 镜像,为容器化应用的部署提供了便利。 拉取镜像 docker image pull registry证书配置 创建镜像仓库的镜像数据目录和证书目录&…...

Pyecharts之饼图与多饼图的应用

在数据可视化领域,饼图是一种常用的图表类型,特别适合展示数据的比例关系。Pyecharts 为我们提供了强大的饼图绘制功能,不仅可以轻松绘制各种饼图,还能对饼图的样式和数据标签进行深度定制,并且可以组合多个饼图以满足…...

51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)

文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…...

蓝桥杯LQ1044 求完数

题目描述 因子:因子也叫因数,例如3515,那么3和5是15的因子。 同时15115,那么1和15也是15的因子。 1,3,5,15 这四个因子是15的所有因子。 完数:如果一个数等于不含它本身的其他因子之…...

Django 日志配置实战指南

日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…...

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复,请确保您系统已安装 Rsync。 如果您安装了极狐GitLab: 如果您使用 Omnibus 软件包,则无需额外操作。如果您使用源代码安装,您需要确定是否安装了 rsync。…...

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…...

随机矩阵投影长度保持引理及其证明

原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 👉前提: X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…...

蓝桥杯真题 - 三国游戏 - 题解

题目链接:https://www.lanqiao.cn/problems/3518/learning/ 个人评价:难度 2 星(满星:5) 前置知识:贪心 整体思路 先假设魏蜀吴中的某一个势力最终获胜的情况下,如何求出事件发生的最大数量&a…...

Spring 源码学习(七)——注解后处理器-2

五 InitDestroyAnnotationBeanPostProcessor 类 1 属性 InitDestroyAnnotationBeanPostProcessor 类用于处理初始化与销毁注解;其中第一个属性为用于标识初始化方法与销毁方法注解类型的 initAnnotationType 与 destroyAnnotationType 属性、还有一个用于标识执行顺…...

即梦(Dreamina)技术浅析(一)

1.技术架构与核心组件 2.生成模型的具体实现 3.多模态融合技术 4.训练数据与模型优化 5.用户交互与创作流程 6.技术挑战与解决方案 7.未来发展方向 1. 技术架构与核心组件 即梦的技术架构可以分为以下几个核心组件: 1.1 前端用户界面(UI) 功能模块: 文字输入框:用…...

Spring MVC(二)

介绍 Cookie 与 Session Session 类似哈希表,存储了一些键值对结构,Key 就是 SessionID,Vaule 就是用户信息,客户端发起会话的时候,服务器一旦接收,就会创建会话【也就是 Session】,通过 Sessi…...

java求职学习day15

多线程 1 基本概念 1.1 程序和进程的概念 (1)程序 - 数据结构 算法,主要指存放在硬盘上的可执行文件。 (2)进程 - 主要指运行在内存中的可执行文件。 (3)目前主流的操作系统都支持多进程&a…...

Typesrcipt泛型约束详细解读

代码示例: // 如果我们直接对一个泛型参数取 length 属性, 会报错, 因为这个泛型根本就不知道它有这个属性 (() > {// 定义一个接口,用来约束将来的某个类型中必须要有length这个属性interface ILength{// 接口中有一个属性lengthlength:number}function getLen…...

[操作系统] 进程地址空间管理

虚拟地址空间的初始化 缺页中断 缺页中断的概念 缺页中断(Page Fault Interrupt) 是指当程序访问的虚拟地址在页表中不存在有效映射(即该页未加载到内存中)时,CPU 会发出一个中断信号,请求操作系统加载所…...

【fly-iot飞凡物联】(20):2025年总体规划,把物联网整套技术方案和实现并落地,完成项目开发和课程录制。

前言 fly-iot飞凡物联专栏: https://blog.csdn.net/freewebsys/category_12219758.html 1,开源项目地址进行项目开发 https://gitee.com/fly-iot/fly-iot-platform 完成项目开发,接口开发。 把相关内容总结成文档,并录制课程。…...

14-6-1C++STL的list

(一)list容器的基本概念 list容器简介: 1.list是一个双向链表容器,可高效地进行插入删除元素 2.list不可以随机存取元素,所以不支持at.(pos)函数与[ ]操作符 (二)list容器头部和尾部的操作 list对象的默…...

vue2和vue3指令

Vue 2 和 Vue 3 的指令系统非常相似,但 Vue 3 在指令方面进行了优化和扩展。以下是 Vue 2 和 Vue 3 中指令的对比: 1. 通用指令 这些指令在 Vue 2 和 Vue 3 中都可以使用,功能一致: 指令说明v-bind绑定 HTML 属性或组件 propsv-…...

求整数的和与均值(信息学奥赛一本通-1061)

【题目描述】 读入n(1≤n≤10000)个整数,求它们的和与均值。 【输入】 输入第一行是一个整数n,表示有n个整数。 第2~n1行每行包含1个整数。每个整数的绝对值均不超过10000。 【输出】 输出一行,先输出和,再输出平均值(保留到小数点…...

CodeForces 611:New Year and Domino ← 二维前缀和

【题目来源】 https://codeforces.com/contest/611/problem/C 【题目描述】 They say "years are like dominoes, tumbling one after the other". But would a year fit into a grid? I dont think so. Limak is a little polar bear who loves to play. He has r…...

【ROS2】RViz2界面类 VisualizationFrame 详解

1、简述 VisualizationFrame 继承自 QMainWindow 和 WindowManagerInterface; 窗口顶部是常规布局:菜单栏 和 工具栏 窗口中心是 RenderPanel,用来渲染3D画面 周围是dock区域,包括:DisplaysPanel、ViewsPanel、TimePanel、SelectionPanel 和 ToolPropertiesPanel Windo…...

梯度下降法 (Gradient Descent) 算法详解及案例分析

梯度下降法 (Gradient Descent) 算法详解及案例分析 目录 梯度下降法 (Gradient Descent) 算法详解及案例分析1. 引言2. 梯度下降法 (Gradient Descent) 算法原理2.1 基本概念2.2 算法步骤2.3 梯度下降法的变种3. 梯度下降法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案…...

【Flutter】旋转元素(Transform、RotatedBox )

这里写自定义目录标题 Transform旋转元素可以改变宽高约束的旋转 - RotatedBox Transform旋转元素 说明:Transform旋转操作改变了元素的方向,但并没有改变它的布局约束。因此,虽然视觉上元素看起来是旋转了,但它仍然遵循原始的宽…...

大数运算之C语言实现

一、 前言 在我们代码编程过程中,我们经常需要处理各种规模的数值。从日常工作中的一些简单算术在到科学研究中的复杂计算,数字无处不在。然而,当数值变的异常庞大时,就需要用到大数运算来进行实现。本文我们将介绍大数运算的基本…...

三高“高性能、高并发、高可靠”系统架构设计系列文章

目录 高并发系统的艺术:如何在流量洪峰中游刃有余 《数据密集型应用系统设计》读后感与高并发高性能实践案例 系统稳定性与高可用保障的几种思路 软件系统限流的底层原理解析 技术解决方案调研 延迟队列调研 重试调研 异步回调调研 分库分表调研 分布式事…...

Java设计模式 十八 状态模式 (State Pattern)

状态模式 (State Pattern) 状态模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。状态模式让一个对象在其状态改变时,其行为也随之改变,看起来就像是改变了对象的类。通过将状态的变化封装到不同的状态对象中,…...

Django创建纯净版项目并启动

1.Django的基本目录结构 2. 创建app项目 python manage.py startapp user# python manage.py 是固定的,代表python脚本,主要用于django中的项目管理 # startapp 创建app # user 你的app名字,也就是功能模块名称3.数据库 进入settings.…...

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接,也没有什么注入点,是正常的科普 利用burp suite抓包,发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…...

element-plus 的table section如何实现单选

如果是单选那么全新的按钮应该隐藏或者不可编辑的状态。但是我没找到改变成不可编辑的方法&#xff0c;只能采取隐藏 <template><!-- 注意要包一层div根元素&#xff0c;否则css样式可能会不生效&#xff0c;原因不详 --><div><el-table ref"proTab…...

利用Qt5.15.2编写Android程序时遇到的问题及解决方法

文章目录 背景1.文件读写 背景 目前我用的是Qt5.15.2来编写Qt程序&#xff0c;环境的配置看我这篇文章【Qt5.15.2配置Android开发环境】 项目中的一些配置的截图&#xff1a; 1.文件读写 假如直接用 QFileDialog::getExistingDirectory来获取路径的话&#xff0c;会得到类…...

奇怪的单词(快速扩张200个单词)

这是一些非常奇怪的单词&#xff1a; screw n.螺丝&#xff1b;螺丝钉 screwdriver n.起子&#xff0c;螺丝刀&#xff0c;改锥 copulation n.连接 copulate a.配合的 bonk n.撞击&#xff1b;猛击 v.轻击&#xff1b;碰撞ebony n.黑檀couple n.夫妇blonde n.金发女郎intimacy…...

three.js+WebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值方面的问题)

上篇大家消化得如何了&#xff1f; 笔者说过&#xff0c;1级编号不同的两篇博文相对独立&#xff0c;所以这里笔者还是先给出完整代码&#xff0c;哪怕跟&#xff08;3&#xff09;没有太大区别。 这里我们把线的粗细调成5&#xff08;排除难选中的因素&#xff09;&#xff…...

postgresql根据主键ID字段分批删除表数据

生产环境针对大表的处理相对比较麻烦。 方案1、直接truncate&#xff0c;可能会遇到系统卡主的情况&#xff0c;因为truncate的过程中会对表进行加锁&#xff0c;会导致数据不能正常的写入 方案2、创建一个同结构的表结构&#xff0c;rename旧表&#xff0c;不停业务rename表担…...

NIO 和 Netty 在 Spring Boot 中的集成与使用

Netty到底是个啥&#xff0c;有啥子作用 1. Netty 的本质&#xff1a;对 NIO 的封装 NIO 的原生问题&#xff1a; Java 的 NIO 提供了非阻塞 I/O 和多路复用机制&#xff0c;但其使用较为复杂&#xff08;如 Selector、Channel、Buffer 的配置和管理&#xff09;。开发者需要自…...

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…...

ThinkPHP 8请求处理-获取请求对象与请求上下文

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用Composer初始化ThinkPHP 8应用_thinkphp8 compos…...

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 目录 【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 优势 适用场景 项目结构 关键代码 优势 消除 switch&#xff1a;将分支逻辑分散到独立的策略类中。 开闭原则&#xff1a;新增类型只需添加新的 TypeHa…...

Pyecharts之词云图、面积图与堆叠面积图

在数据可视化的精彩世界里&#xff0c;我们可以运用各种各样的图表来展现数据的魅力&#xff0c;帮助我们更好地理解和分析数据。Pyecharts 作为一款功能强大的数据可视化工具&#xff0c;为我们提供了丰富的图表类型&#xff0c;今天我们将深入探讨词云图、面积图和堆叠面积图…...

SpringBoot3+Vue3开发学生选课管理系统

功能介绍 分三个角色登录&#xff1a;学生登录&#xff0c;老师登录&#xff0c;教务管理员登录&#xff0c;不同用户功能不同&#xff01; 1.学生用户功能 选课记录&#xff0c;查看选课记录&#xff0c;退选。选课管理&#xff0c;进行选课。通知管理&#xff0c;查看通知消…...

71.在 Vue 3 中使用 OpenLayers 实现按住 Shift 拖拽、旋转和缩放效果

前言 在前端开发中&#xff0c;地图功能是一个常见的需求。OpenLayers 是一个强大的开源地图库&#xff0c;支持多种地图源和交互操作。本文将介绍如何在 Vue 3 中集成 OpenLayers&#xff0c;并实现按住 Shift 键拖拽、旋转和缩放地图的效果。 实现效果 按住 Shift 键&#…...

Mybatis——sql映射文件中的增删查改

映射文件内的增删查改 准备工作 准备一张数据表&#xff0c;用于进行数据库的相关操作。新建maven工程&#xff0c; 导入mysql-connector-java和mybatis依赖。新建一个实体类&#xff0c;类的字段要和数据表的数据对应编写接口编写mybatis主配置文件 public class User {priva…...

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记&#xff1a;卓越强迫症强大恐惧症&#xff0c;在亲子家庭、职场关系里尤其是纵向关系模型里&#xff0c;这两种状态很容易无缝衔接。尤其父母对子女、领导对下属&#xff0c;都有望子成龙、强将无弱兵的期望&#xff0c;然而在你的面前&#xff0c;他们才是永远强大的…...

立创开发板入门ESP32C3第八课 修改AI大模型接口为deepseek3接口

#原代码用的AI模型是minimax的API接口&#xff0c;现在试着改成最热门的deepseek3接口。# 首先按理解所得&#xff0c;在main文件夹下&#xff0c;有minimax.c和minimax.h, 它们是这个API接口的头文件和实现文件&#xff0c;然后在main.c中被调用。所以我们一步步更改。 申请…...

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…...

为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️

前言 在使用 Spring 框架时&#xff0c;依赖注入&#xff08;DI&#xff09;是一个非常重要的概念。通过注解&#xff0c;我们可以方便地将类的实例注入到其他类中&#xff0c;提升开发效率。Autowired又是被大家最为熟知的方式&#xff0c;但很多开发者在使用 IntelliJ IDEA …...