【Rust光年纪】Rust多媒体处理库全面比较:探索安全高效的多媒体处理利器

news/2024/9/17 20:46:03/ 标签: rust, 开发语言, 后端

多媒体处理不再困扰:解锁Rust语言下的六大多媒体利器

前言

随着Rust语言的快速发展,越来越多的多媒体处理库和工具集开始出现,为开发人员提供了丰富的选择。本文将对几个用于Rust语言的多媒体处理库进行介绍,并对它们的核心功能、使用场景、安装配置以及API概览进行概括和比较。

欢迎订阅专栏:Rust光年纪

文章目录

  • 多媒体处理不再困扰:解锁Rust语言下的六大多媒体利器
    • 前言
    • 1. ffmpeg-rs:一个用于Rust语言的FFmpeg绑定
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装方法
        • 1.2.2 基本设置
      • 1.3 API 概览
        • 1.3.1 视频编解码
        • 1.3.2 音频处理
    • 2. video:一个用于Rust语言的视频处理库
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装指南
        • 2.2.2 基本配置
      • 2.3 API 概览
        • 2.3.1 视频剪辑
        • 2.3.2 视频特效添加
    • 3. RustyVideoTools:一个用于Rust语言的视频处理工具集
        • 3.1 简介
          • 3.1.1 核心功能
          • 3.1.2 使用场景
        • 3.2 安装与配置
          • 3.2.1 安装指南
          • 3.2.2 基本配置
        • 3.3 API 概览
          • 3.3.1 视频转码
          • 3.3.2 视频水印添加
    • 4. Rust-Media:一个用于Rust语言的多媒体处理框架
        • 4.1 简介
          • 4.1.1 核心功能
          • 4.1.2 使用场景
        • 4.2 安装与配置
          • 4.2.1 安装指南
          • 4.2.2 基本配置
        • 4.3 API 概览
          • 4.3.1 视频流处理
          • 4.3.2 音频处理接口
    • 5. VelvetVideo:一个用于Rust语言的视频编辑库
        • 5.1 简介
          • 5.1.1 核心功能
          • 5.1.2 使用场景
        • 5.2 安装与配置
          • 5.2.1 安装指南
          • 5.2.2 基本设置
        • 5.3 API 概览
          • 5.3.1 视频剪辑和合成
          • 5.3.2 视频滤镜添加
    • 6. GStreamer-rs:一个用于Rust语言的GStreamer多媒体框架绑定
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本配置
      • 6.3 API 概览
        • 6.3.1 多媒体数据处理
        • 6.3.2 流媒体播放器搭建
    • 总结

1. ffmpeg-rs:一个用于Rust语言的FFmpeg绑定

1.1 简介

ffmpeg-rs是一个为Rust语言提供的FFmpeg绑定,允许开发者使用Rust来进行视频处理、编解码等操作。

1.1.1 核心功能
  • 视频编解码
  • 视频格式转换
  • 视频过滤器
1.1.2 使用场景

ffmpeg-rs可以在需要对视频进行处理、分析以及转码的场景中发挥作用。例如,在视频编辑软件、媒体处理平台以及实时流媒体处理中都可以应用到该库。

1.2 安装与配置

要在Rust项目中使用ffmpeg-rs,首先需要安装FFmpeg库本身,然后通过Cargo.toml文件将ffmpeg-rs添加到项目依赖中。

1.2.1 安装方法

首先需确保系统中已经安装了FFmpeg。接着,在Cargo.toml文件中添加如下依赖:

rust">[dependencies]
ffmpeg = "4"
1.2.2 基本设置

在Rust项目中引入ffmpeg-rs库:

rust">extern crate ffmpeg;

1.3 API 概览

ffmpeg-rs提供了一系列的API用于视频处理。

1.3.1 视频编解码
rust">use ffmpeg::format;
use ffmpeg::codec;fn main() {// 读取视频文件let mut ictx = format::input(&input_path).unwrap(); // 获取视频流let input = ictx.streams().best(codec::Type::Video).unwrap();// 解码器let mut decoder = input.codec().decoder().unwrap();// 编码器let mut encoder = output.codec().encoder().video().unwrap();// 转码for (stream, packet) in ictx.packets() {if stream.index() == index {let mut decoded = Some(decoder.decode(&packet)?);while let Some(frame) = decoded.take() {let mut enc_pkt = encoder.encode(&frame)?;while !enc_pkt.is_empty() {output.write_packet(&enc_pkt)?;}}}}
}
1.3.2 音频处理
rust">use ffmpeg::format;
use ffmpeg::codec;fn main() {// 读取音频文件let mut ictx = format::input(&input_path).unwrap(); // 获取音频流let input = ictx.streams().best(codec::Type::Audio).unwrap();// 解码器let mut decoder = input.codec().decoder().unwrap();// 编码器let mut encoder = output.codec().encoder().audio().unwrap();// 转码for (stream, packet) in ictx.packets() {if stream.index() == index {let mut decoded = Some(decoder.decode(&packet)?);while let Some(frame) = decoded.take() {let mut enc_pkt = encoder.encode(&frame)?;while !enc_pkt.is_empty() {output.write_packet(&enc_pkt)?;}}}}
}

官网链接:ffmpeg-rs

2. video:一个用于Rust语言的视频处理库

2.1 简介

video 是一个专门为 Rust 编程语言设计的视频处理库,提供了丰富的功能和灵活的 API,使得在 Rust 中进行视频处理变得简单而又高效。

2.1.1 核心功能
  • 视频剪辑
  • 视频特效添加
2.1.2 使用场景
  • 视频编辑软件开发
  • 视频数据分析

2.2 安装与配置

安装 video 库前,需要确保已经安装了 Rust 编程语言的工具链。可以通过 Rust 的包管理工具 Cargo 来安装 video。

2.2.1 安装指南

在项目的 Cargo.toml 文件中添加 video 库的依赖:

[dependencies]
video = "0.6.0"

然后运行以下命令进行安装:

$ cargo build
2.2.2 基本配置

在代码中引入 video 库:

rust">extern crate video;

2.3 API 概览

video 提供了丰富的 API,以下是其中部分核心功能的使用示例。

2.3.1 视频剪辑
rust">use video::clip::Clip;fn main() {let mut clip = Clip::new("input.mp4");// 设置起始时间和结束时间clip.set_start_time(10); // 从第 10 秒开始clip.set_end_time(30);   // 到第 30 秒结束// 导出剪辑后的视频clip.export("output.mp4");
}

更多关于视频剪辑的操作可以参考 video 文档。

2.3.2 视频特效添加
rust">use video::effect::{Effect, EffectType};fn main() {let mut effect = Effect::new("input.mp4");// 添加黑白滤镜effect.add_filter(EffectType::BlackAndWhite);// 添加模糊特效effect.add_filter(EffectType::Blur { radius: 5 });// 导出添加特效后的视频effect.export("output.mp4");
}

更多关于视频特效添加的操作可以参考 video 文档。

3. RustyVideoTools:一个用于Rust语言的视频处理工具集

RustyVideoTools 是一个用于 Rust 语言的视频处理工具集,它提供了丰富的功能和灵活的 API 接口,可以用于视频转码、添加水印等操作。

3.1 简介

RustyVideoTools 的核心功能包括视频转码和视频水印添加。

3.1.1 核心功能
  • 视频转码:将视频文件从一种编解码格式转换为另一种格式,如将 MP4 转换为 AVI。
  • 视频水印添加:在视频中添加图片或文字水印,用于版权保护或个性化需求。
3.1.2 使用场景

RustyVideoTools 可以广泛应用于视频网站、在线教育平台、多媒体处理软件等领域,满足用户对视频处理的多样化需求。

3.2 安装与配置
3.2.1 安装指南

要使用 RustyVideoTools,首先需要安装 Rust 编程语言。安装 Rust 的具体步骤可以参考 Rust 官方网站。

然后,在项目的 Cargo.toml 文件中添加 RustyVideoTools 的依赖:

[dependencies]
rusty_video_tools = "0.1.0"

接着在项目的源代码中引入 RustyVideoTools 库:

rust">extern crate rusty_video_tools;
3.2.2 基本配置

在开始使用 RustyVideoTools 之前,需要进行基本的配置,比如设置视频处理的参数、选择输入输出文件路径等。

3.3 API 概览

RustyVideoTools 提供了简洁而强大的 API 接口,下面介绍其中的两个主要功能:

3.3.1 视频转码

以下是一个简单的 Rust 代码示例,演示如何使用 RustyVideoTools 进行视频转码:

rust">use rusty_video_tools::{Video, Codec};fn main() {let input_path = "/path/to/input.mp4";let output_path = "/path/to/output.avi";let video = Video::open(input_path).unwrap();video.transcode(Codec::AVI, output_path).unwrap();
}

在上面的示例中,我们打开了一个名为 input.mp4 的视频文件,并将其转码为 AVI 格式,并保存到 output.avi 中。

3.3.2 视频水印添加

下面是一个使用 RustyVideoTools 添加视频水印的示例代码:

rust">use rusty_video_tools::{Video, Watermark, Position};fn main() {let input_path = "/path/to/input.mp4";let output_path = "/path/to/output_with_watermark.mp4";let mut video = Video::open(input_path).unwrap();let watermark = Watermark::new("/path/to/watermark.png", Position::BottomRight);video.add_watermark(&watermark, output_path).unwrap();
}

在上面的示例中,我们打开了一个名为 input.mp4 的视频文件,并在视频的右下角添加了一个水印图片,并将处理后的视频保存到 output_with_watermark.mp4 中。

通过上述示例,可以看出 RustyVideoTools 提供了简单易用的 API,方便开发者进行视频处理操作。

以上是 RustyVideoTools 的简单介绍和部分 API 示例,更多详细信息可以参考 RustyVideoTools GitHub 仓库。

4. Rust-Media:一个用于Rust语言的多媒体处理框架

Rust-Media是一个专为Rust语言设计的多媒体处理框架,提供了丰富的功能和灵活的接口,使得在Rust中进行视频和音频处理变得更加简单和高效。

4.1 简介
4.1.1 核心功能

Rust-Media框架主要包括视频编解码、滤镜处理、格式转换、音频处理、流媒体处理等功能。它提供了一系列可以组合使用的模块,以便开发者可以根据自己的需求选择合适的模块来完成多媒体处理任务。

4.1.2 使用场景

Rust-Media适用于各种多媒体处理场景,包括但不限于视频编辑软件、实时视频处理系统、音频处理工具等。由于其高性能和稳定性,Rust-Media也常被用于对多媒体数据进行高效处理和编解码。

4.2 安装与配置
4.2.1 安装指南

你可以通过Cargo.toml将Rust-Media集成到你的项目中:

[dependencies]
rust-media = "0.9"

然后在代码中引入需要使用的模块即可开始使用。

4.2.2 基本配置

在使用Rust-Media之前,你可能需要安装一些依赖库,比如FFmpeg等,以确保Rust-Media可以正常运行。详细的配置信息可以参考官方文档。

4.3 API 概览
4.3.1 视频流处理

Rust-Media提供了丰富的视频流处理接口,可以实现视频编解码、帧率控制、尺寸调整、滤镜处理等功能。以下是一个简单的示例,演示了如何使用Rust-Media读取视频文件并获取其中每一帧的时间戳:

rust">use rust_media::video::VideoReader;fn main() {let mut reader = VideoReader::open("input.mp4").unwrap();for (frame, timestamp) in reader.frames() {println!("Frame at timestamp: {}", timestamp);}
}

更多关于视频流处理的API细节,请参考Rust-Media的官方文档。

4.3.2 音频处理接口

除了视频处理外,Rust-Media还提供了丰富的音频处理接口,包括音频解码、编码、混音、格式转换等功能。下面是一个简单的例子,展示了如何使用Rust-Media读取音频文件并打印出音频流的采样率:

rust">use rust_media::audio::AudioReader;fn main() {let mut reader = AudioReader::open("input.wav").unwrap();println!("Sample rate: {}", reader.sample_rate());
}

有关更多音频处理接口的详情,请查阅Rust-Media的官方文档。

5. VelvetVideo:一个用于Rust语言的视频编辑库

VelvetVideo 是一个专为 Rust 语言设计的视频编辑库,它可以帮助开发人员处理视频文件,并提供了丰富的功能来满足不同的需求。

5.1 简介
5.1.1 核心功能

VelvetVideo 提供了视频剪辑、合成、滤镜添加等核心功能,让开发者能够方便地进行视频处理操作。同时,它还支持多种视频格式和编解码器。

5.1.2 使用场景

VelvetVideo 可以用于构建视频编辑软件、视频处理工具、视频转码服务等应用场景,为开发者提供了高效、灵活的视频处理解决方案。

5.2 安装与配置
5.2.1 安装指南

要使用 VelvetVideo,首先需要在项目的 Cargo.toml 文件中添加以下依赖:

[dependencies]
velvet-video = "0.3"

然后在代码中引入 VelvetVideo 库:

rust">extern crate velvet_video;
5.2.2 基本设置

在开始使用 VelvetVideo 之前,需要进行一些基本的设置,例如选择合适的视频格式、配置编解码器等。根据具体需求,可参考 VelvetVideo 的官方文档进行相关设置。

5.3 API 概览
5.3.1 视频剪辑和合成

VelvetVideo 提供了丰富的 API 来进行视频剪辑和合成操作。下面是一个简单的示例代码,演示如何对视频进行剪辑和合成:

rust">use velvet_video::{Video, EncoderConfig, PixelFormat};fn main() {// 打开待处理的视频文件let video = Video::open("input.mp4").unwrap();// 对视频进行剪辑操作let clipped_video = video.clip(10.0, 30.0).unwrap();// 配置输出视频的编码器参数let encoder_config = EncoderConfig::new("output.mp4").with_video_codec("libx264").with_pixel_format(PixelFormat::Yuv420p);// 将剪辑后的视频合成并输出到指定文件clipped_video.encode_to(encoder_config).unwrap();
}

通过上述代码,我们成功地对视频进行了剪辑并生成了新的视频文件。

5.3.2 视频滤镜添加

除了基本的剪辑和合成功能外,VelvetVideo 还支持给视频添加滤镜。下面是一个简单的示例代码,展示了如何为视频添加黑白滤镜:

rust">use velvet_video::{Video, Filter, FilterConfig};fn main() {// 打开待处理的视频文件let video = Video::open("input.mp4").unwrap();// 创建黑白滤镜let grayscale_filter = Filter::new("hue=s=0");// 配置滤镜参数let filter_config = FilterConfig::new().add_filter(grayscale_filter);// 为视频添加滤镜并输出到指定文件video.apply_filter("output.mp4", &filter_config).unwrap();
}

以上代码通过 VelvetVideo 成功为视频添加了黑白滤镜,生成了新的视频文件。

通过 VelvetVideo,开发者可以轻松实现视频处理的各种功能,为视频处理领域的开发工作提供了强大的支持。

更多关于 VelvetVideo 的信息和详细文档,请参考 VelvetVideo GitHub 仓库。

6. GStreamer-rs:一个用于Rust语言的GStreamer多媒体框架绑定

6.1 简介

GStreamer-rs是一个用于Rust语言的GStreamer多媒体框架绑定,它允许开发人员使用Rust语言进行多媒体数据处理和流媒体播放器搭建。

6.1.1 核心功能

GStreamer-rs提供了对GStreamer多媒体框架的绑定,使得开发者可以利用Rust语言的优势进行多媒体数据处理、流媒体播放和其他相关功能的开发。

6.1.2 使用场景

GStreamer-rs在需要多媒体数据处理和流媒体播放的场景下非常有用,特别适合那些希望使用Rust语言进行多媒体开发的开发者。

6.2 安装与配置

6.2.1 安装指南

你可以通过Cargo来安装GStreamer-rs,只需在项目的Cargo.toml文件中添加以下内容:

[dependencies]
gstreamer = "0.16"
gstreamer-app = "0.16"
gstreamer-audio = "0.16"
gstreamer-video = "0.16"

更多详细信息可以参考GStreamer-rs官方文档。

6.2.2 基本配置

安装完成后,你可以按照GStreamer官方文档进行基本配置,包括环境变量设置、插件安装等。

6.3 API 概览

6.3.1 多媒体数据处理

以下是一个简单的示例代码,演示了如何使用GStreamer-rs进行音频数据处理:

rust">extern crate gstreamer as gst;
use gst::prelude::*;fn main() {// 初始化GStreamergst::init().unwrap();// 创建Pipelinelet pipeline = gst::Pipeline::new(None);// 创建元素let src = gst::ElementFactory::make("audiotestsrc", None).unwrap();let sink = gst::ElementFactory::make("autoaudiosink", None).unwrap();// 将元素添加到Pipeline中pipeline.add_many(&[&src, &sink]).unwrap();src.link(&sink).unwrap();// 启动Pipelinelet ret = pipeline.set_state(gst::State::Playing);match ret {gst::StateChangeReturn::Failure => println!("Failed to start pipeline!"),_ => (),}// 等待直到接收到消息let bus = pipeline.get_bus().unwrap();for msg in bus.iter_timed(gst::CLOCK_TIME_NONE) {match msg.view() {gst::MessageView::Eos(_) => break,_ => (),}}// 停止Pipelinepipeline.set_state(gst::State::Null).unwrap();
}
6.3.2 流媒体播放器搭建

以下是一个简单的使用 GStreamer-rs 构建流媒体播放器的示例代码:

rust">use gst::prelude::*;
use gst_player::prelude::*;fn main() {// 初始化 GStreamergst::init().unwrap();// 创建一个播放器let player = gst_player::Player::new();// 设置播放地址player.set_property("uri", &"https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm").unwrap();// 开始播放player.play();// 让播放器运行一段时间std::thread::sleep(std::time::Duration::from_secs(10));// 停止播放player.stop();
}

更多关于流媒体播放器的 API 和示例代码可以参考官方文档:GStreamer-rs Player API 文档

总结

本文综合概述了几个用于Rust语言的多媒体处理库和工具集,从视频编解码、剪辑、特效添加到音频处理等方面进行了全面的比较和总结。通过阅读本文,读者将能够对这些库有一个清晰的认识,为自己的多媒体处理需求选择最合适的工具提供了参考。


http://www.ppmy.cn/news/1516726.html

相关文章

【算法】希尔排序、计数排序、桶排序、基数排序

1 希尔排序 2 计数排序 3 桶排序 4 基数排序 1 希尔排序 """ 希尔排序(Shell Sort)是一种插入排序算法的改进版本,得名于其发明者Donald Shell。 它通过比较一定间隔的元素来进行排序,以减少数据移动的次数&#…

Jmeter进行http接口测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径&#xf…

【HarmonyOS NEXT星河版开发实战】天气查询APP

目录 前言 界面效果展示 首页 添加和删除 界面构建讲解 1. 获取所需数据 2. 在编译器中准备数据 3. index页面代码讲解 3.1 导入模块: 3.2 定义组件: 3.3 定义状态变量: 3.4 定义Tabs控制器: 3.5 定义按钮样式: 3.6 页面显示时触发…

Java核心API——Collection集合的工具类Collections

集合的排序 int类型的排序 * 集合的排序 * java.util.Collections是集合的工具类&#xff0c;提供了很多static方法用于操作集合 * 其中提供了一个名为sort的方法&#xff0c;可以对List集合进行自然排序(从小到大) List<Integer> list new ArrayList<>();Rand…

96页PPT集团战略解码会工具与操作流程

德勤集团在战略解码过程中通常会用到以下一些具体工具&#xff1a; 一、平衡计分卡&#xff08;Balanced Scorecard&#xff09; 财务维度&#xff1a; 明确关键财务指标&#xff0c;如营业收入、利润、投资回报率等。你可以通过分析历史财务数据和行业趋势&#xff0c;确定…

设计模式24-命令模式

设计模式24-命令模式 写在前面行为变化模式 命令模式的动机定义与结构定义结构 C 代码推导优缺点应用场景总结补充函数对象&#xff08;Functors&#xff09;定义具体例子示例&#xff1a;使用函数对象进行自定义排序代码说明输出结果具体应用 优缺点应用场景 命令模式&#xf…

鸿蒙位置服务

位置服务 1、首先申请权限 在module.json5文件下申请位置权限 "requestPermissions": [{"name": "ohos.permission.LOCATION", // 权限名称,为系统已定义的权限"reason": "$string:location_reason", // 申请权限的原因,…

windows 核心编程第五章:演示作业的使用及获取统计信息

演示作业的使用及获取统计信息 演示作业的使用及获取统计信息 文章目录 演示作业的使用及获取统计信息演示作业的使用及获取统计信息 演示作业的使用及获取统计信息 /* 演示作业的使用及获取统计信息 */#include <stdio.h> #include <Windows.h> #include <tc…

HBase原理和操作

目录 一、HBase在Zookeeper中的存储元数据信息集群状态信息 二、HBase的操作Web Console命令行操作 三、HBase中数据的保存过程 一、HBase在Zookeeper中的存储 元数据信息 HBase的元数据信息是HBase集群运行所必需的关键数据&#xff0c;它存储在Zookeeper的"/hbase&quo…

ARM32开发——(七)GD32F4串口引脚_复用功能_查询

1. GD32F4串口引脚查询 TX RX CK CTS RTS USART0 PA9,PA15,PB6 PA10,PB3,PB7 PA8 PA11 PA12 USART1 PA2,PD5 PA3,PD6 PA4,PD7 PA0,PD3 PA1,PD4 USART2 PB10,PC10,PD8 PB11,PC5,PD9 PB12,PC12,PD10 PB13,PD11 PB14,PD12 UART3 PA0,PC10 PA1,PC11 …

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…

【运筹学】【数据结构】【经典算法】最小生成树问题及贪心算法设计

1 知识回顾 我们已经讲过最小生成树问题的基础知识&#xff0c;我们现在想要利用贪心算法解决该问题。我们再来回顾一下最小生成树问题和贪心算法的基础知识。 最小生成树问题就是从某个图中找出总权重最小的生成树。 贪心算法是一种算法设计范式&#xff0c;每一步都选…

深度学习学习经验——全连接神经网络(FCNN)

什么是全连接神经网络&#xff1f; 全连接神经网络&#xff08;FCNN&#xff09;是最基础的神经网络结构&#xff0c;它由多个神经元组成&#xff0c;这些神经元按照层级顺序连接在一起。每一层的每个神经元都与前一层的每个神经元连接。 想象你在参加一个盛大的晚会&#xf…

Vue中的this.$emit()方法详解【父子组件传值常用】

​在Vue中&#xff0c;this.$emit()方法用于触发自定义事件。它是Vue实例的一个方法&#xff0c;可以在组件内部使用。 使用this.$emit()方法&#xff0c;你可以向父组件发送自定义事件&#xff0c;并传递数据给父组件。父组件可以通过监听这个自定义事件来执行相应的逻辑。 …

问界M7 Pro这招太狠了,直击理想L6/L7要害

文 | AUTO芯球 作者 | 雷慢 李想的理想估计要失眠了&#xff0c;为什么啊&#xff1f; 前有L6悬架薄如铁片被曝光&#xff0c;被车主们骂了个狗血淋头&#xff0c; 现在又来个问界M7 Pro版&#xff0c; 24.98万的后驱智驾版就上华为ADS主视觉智驾了&#xff0c; 两个后驱&…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务&#xff0c;NestJS微服务快速入门 博客地址&#xff1a;TMDOG的博客 在前几篇博客中&#xff0c;我们探讨了如何在 NestJS 中的一些基础功能&#xff0c;并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客&#xff0c;我们将进入…

基于改进YOLOv8的景区行人检测算法

贵向泉, 刘世清, 李立, 秦庆松, 李唐艳. 基于改进YOLOv8的景区行人检测算法[J]. 计算机工程, 2024, 50(7): 342-351. DOI: 10.19678/j.issn.10 原文链接如下&#xff1a;基于改进YOLOv8的景区行人检测算法https://www.ecice06.com/CN/rich_html/10.19678/j.issn.1000-3428.006…

解决Element-plus中Carousel(走马灯)图片无法正常加载的bug

前言&#xff1a; 最近帮助朋友解决了一个使用Element-plus中Carousel&#xff08;走马灯&#xff09;图片无法正常加载的bug&#xff0c;经过笔者的不断努力终于实现了&#xff0c;现在跟大家分享一下&#xff1a; 朋友原来的代码是这样的&#xff1a; <template><…

【计算机网络】电路交换、报文交换、分组交换

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;通过物理线路的连接&#xff0c;动态地分配传输线路资源 ​​​​

依靠 VPN 生存——探索 VPN 后利用技术

执行摘要 在这篇博文中,Akamai 研究人员强调了被忽视的 VPN 后利用威胁;也就是说,我们讨论了威胁行为者在入侵 VPN 服务器后可以用来进一步升级入侵的技术。 我们的发现包括影响 Ivanti Connect Secure 和 FortiGate VPN 的几个漏洞。 除了漏洞之外,我们还详细介绍了一组…