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

音频采集(VUE3+JAVA)

vue部分代码

xx.vue

import Recorder from './Recorder.js';
export default {data() {return {mediaStream: null,recorder: null,isRecording: false,audioChunks: [],vadInterval: null // 新增:用于存储声音活动检测的间隔 ID};},async mounted() {this.mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });this.startVAD();},beforeDestroy() {// 新增:组件销毁前清理声音活动检测的间隔if (this.vadInterval) {cancelAnimationFrame(this.vadInterval);}},created() {this.defaultLogin();},methods: {startVAD() {const audioContext = new (window.AudioContext || window.webkitAudioContext)();const source = audioContext.createMediaStreamSource(this.mediaStream);const analyser = audioContext.createAnalyser();source.connect(analyser);analyser.fftSize = 2048;const bufferLength = analyser.frequencyBinCount;const dataArray = new Uint8Array(bufferLength);const checkVoiceActivity = () => {analyser.getByteFrequencyData(dataArray);let sum = 0;for (let i = 0; i < bufferLength; i++) {sum += dataArray[i];}const average = sum / bufferLength;if (average > 30 && !this.isRecording) {this.startRecording();} else if (average < 10 && this.isRecording) {setTimeout(() => {analyser.getByteFrequencyData(dataArray);let newSum = 0;for (let i = 0; i < bufferLength; i++) {newSum += dataArray[i];}const newAverage = newSum / bufferLength;if (newAverage < 10) {this.stopRecording();}}, 500);}this.vadInterval = requestAnimationFrame(checkVoiceActivity); // 存储间隔 ID};requestAnimationFrame(checkVoiceActivity);},startRecording() {this.recorder = new Recorder(this.mediaStream);this.recorder.record();this.isRecording = true;console.log('开始录制');},stopRecording() {if (this.recorder && this.isRecording) {this.recorder.stopAndExport((blob) => {const formData = new FormData();formData.append('audioFile', blob, 'recorded-audio.opus');});this.isRecording = false;console.log('停止录制');}}}
};

Recorder.js

class Recorder {constructor(stream) {const AudioContext = window.AudioContext || window.webkitAudioContext;try {this.audioContext = new AudioContext();} catch (error) {console.error('创建 AudioContext 失败:', error);throw new Error('无法创建音频上下文,录音功能无法使用');}this.stream = stream;this.mediaRecorder = new MediaRecorder(stream);this.audioChunks = [];this.mediaRecorder.addEventListener('dataavailable', (event) => {if (event.data.size > 0) {this.audioChunks.push(event.data);}});this.mediaRecorder.addEventListener('stop', () => {console.log('录音停止,开始导出音频');});}record() {try {this.mediaRecorder.start();} catch (error) {console.error('开始录音失败:', error);throw new Error('无法开始录音');}}stop() {try {this.mediaRecorder.stop();} catch (error) {console.error('停止录音失败:', error);throw new Error('无法停止录音');}}exportWAV(callback) {try {const blob = new Blob(this.audioChunks, { type: 'audio/wav' });console.log('生成的 Blob 的 MIME 类型:', blob.type);const reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onloadend = () => {const arrayBuffer = reader.result;};callback(blob);this.audioChunks = [];} catch (error) {console.error('导出 WAV 格式失败:', error);throw new Error('无法导出 WAV 格式的音频');}}stopAndExport(callback) {this.mediaRecorder.addEventListener('stop', () => {this.exportWAV(callback);});this.stop();}
}export default Recorder;

JAVA部分

VoiceInputServiceImpl.java

package com.medical.asr.service.impl;import com.medical.asr.service.VoiceInputService;
import com.medical.common.props.FileProps;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;@Service
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class VoiceInputServiceImpl implements VoiceInputService {@Autowiredprivate FileProps fileProps;/*** 接收音频文件,并保存在目录下* @param audioFile 音频文件* @return 文件路径*/private String receiveAudio(MultipartFile audioFile) {if (audioFile == null || audioFile.isEmpty()) {log.info("未收到音频文件");return StringPool.EMPTY;}try {//文件存放的地址String uploadDir = fileProps.getUploadPath();System.out.println(uploadDir);File dir = new File(uploadDir);if (!dir.exists()) {dir.mkdirs();}String fileName = System.currentTimeMillis() + "-" + audioFile.getOriginalFilename();Path filePath = Paths.get(uploadDir, fileName);Files.write(filePath, audioFile.getBytes());log.info("Received audio file: " + fileName);log.info("音频接收成功");return filePath.toString();} catch (IOException e) {log.error("保存音频文件时出错: " + e.getMessage());return StringPool.EMPTY;}}}

但是出了一个问题,就是这样生成的音频文件,通过ffmpeg查看发现是存在问题的,用来听没问题,但是要做加工,就不是合适的WAV文件。

人家需要满足这样的条件:

而我们这边出来的音频文件是这样的:

sample_rate(采样率), bits_per_sample(每个采样点所使用的位数 / 位深度), codec_name(编解码器名称), codec_long_name(编解码器完整名称 / 详细描述)这几项都不满足。于是查找opus转pcm的方案,修改之前的代码,新代码为:

private String receiveAudio(MultipartFile audioFile) {if (audioFile == null || audioFile.isEmpty()) {log.info("未收到音频文件");return StringPool.EMPTY;}try {String uploadDir = fileProps.getUploadPath();System.out.println(uploadDir);File dir = new File(uploadDir);if (!dir.exists()) {dir.mkdirs();}String fileName = System.currentTimeMillis() + "-" + audioFile.getOriginalFilename();Path filePath = Paths.get(uploadDir, fileName);Files.write(filePath, audioFile.getBytes());log.info("Received audio file: " + fileName);log.info("音频接收成功");// 转换音频格式和采样率int dotIndex = fileName.lastIndexOf('.');if (dotIndex!= -1) {fileName = fileName.substring(0, dotIndex);}String outputPath = Paths.get(uploadDir, "converted_" + fileName + ".wav").toString();//新增的部分convertAudio(filePath.toString(), outputPath);return outputPath;} catch (IOException e) {log.error("保存音频文件时出错: " + e.getMessage());return StringPool.EMPTY;}}public static void convertAudio(String inputPath, String outputPath) {String ffmpegCommand = "ffmpeg -i " + inputPath + " -ar 16000 -ac 1 -acodec pcm_s16le " + outputPath;try {Process process = Runtime.getRuntime().exec(ffmpegCommand);// 读取进程的输出和错误流,以便及时发现问题BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine())!= null) {System.out.println(line);}reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));while ((line = reader.readLine())!= null) {System.out.println(line);}process.waitFor();} catch (IOException | InterruptedException e) {log.error("转换音频时出错: " + e.getMessage());e.printStackTrace();}}

这里面使用了ffmpeg的命令,如果当前环境没有ffmpeg,要记得先去下载安装ffmpeg,然后配置环境变量后再使用。

相关文章:

音频采集(VUE3+JAVA)

vue部分代码 xx.vue import Recorder from ./Recorder.js; export default {data() {return {mediaStream: null,recorder: null,isRecording: false,audioChunks: [],vadInterval: null // 新增&#xff1a;用于存储声音活动检测的间隔 ID};},async mounted() {this.mediaSt…...

Linux运维篇-存储基础知识

什么是存储 用于存放数据信息的设备和介质&#xff0c;等同于计算机系统中的外部存储&#xff0c;是一个完整的系统。 存储的结构和趋势 存储的体系结构 当前存储的主要体系结构有三种&#xff1a; DASNASSAN 存储的发展趋势 ssd固态硬盘云存储一体化应用存储设备非结构…...

【git】已上传虚拟环境的项目更改成不再上传虚拟环境

虽然git用了很长时间&#xff0c;但是距离精通还是太远了。注意到虚拟环境是因为上传项目时用到的系统是macOS&#xff0c;而拉取项目时用到的系统是win&#xff0c;意识到是时候学习知识了&#xff08;好懒啊&#xff09;。 头一次上传&#xff1a;使用.gitignore避免虚拟环境…...

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…...

Android GreenDAO 适配 AGP 8.0+

在 Android 中使用 GreenDao&#xff0c;由于 GreenDao 现在不维护&#xff0c;所以更新到新版本的 Gradle 经常出问题&#xff0c;在这记录一些升级遇到的问题&#xff0c;并且记录解决方案。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、‘:app…...

使用html css js 来实现一个服装行业的企业站源码-静态网站模板

最近在练习 前端基础&#xff0c;html css 和js 为了加强 代码的 熟悉程序&#xff0c;就使用 前端 写了一个个服装行业的企业站。把使用的技术 和 页面效果分享给大家。 应用场景 该制衣服装工厂官网前端静态网站模板主要用于前端练习和编程练习&#xff0c;适合初学者进行 HT…...

小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格

文章目录 一、对比表格二、目录2.1 服务2.2 数据2.3 安全 一、对比表格 下表从多个维度对服务治理、数据治理和安全治理进行详细对比&#xff0c;为读者提供一个直观而全面的参考框架。 维度服务治理数据治理安全治理定义对软件开发全流程、应用交付及API和接口管理进行规范化…...

SpringBoot3.x整合WebSocket

SpringBoot3.x整合WebSocket 本文主要介绍最新springboot3.x下如何整合WebSocket. WebSocket简述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它允许在浏览器和服务器之间进行实时的、双向的通信。相对于传统的基于请求和响应的 HTTP 协议&#xff…...

SpringBoot中自动装配机制的原理

SpringBoot中的自动装配机制是其核心特性之一&#xff0c;其原理主要基于一系列约定和配置&#xff0c;能够根据项目的依赖和配置自动为应用程序加载和配置需要的Spring组件。以下是SpringBoot自动装配机制原理的详细解释&#xff1a; 一、启动类和注解 SpringBootApplicatio…...

STM32外设SPI FLASH应用实例

STM32外设SPI FLASH应用实例 1. 前言1.1 硬件准备1.2 软件准备 2. 硬件连接3. 软件实现3.1 SPI 初始化3.2 QW128 SPI FLASH 驱动3.3 乒乓存储实现 4. 测试与验证4.1 数据备份测试4.2 数据恢复测试 5 实例5.1 参数结构体定义5.2 存储参数到 SPI FLASH5.3 从 SPI FLASH 读取参数5…...

PHP支付宝--转账到支付宝账户

官方参考文档&#xff1a; ​https://opendocs.alipay.com/open/62987723_alipay.fund.trans.uni.transfer?sceneca56bca529e64125a2786703c6192d41&pathHash66064890​ 可以使用默认应用&#xff0c;也可以自建新应用&#xff0c;此处以默认应用来讲解【默认应用默认支持…...

太空飞船任务,生成一个地球发射、火星着陆以及下一次发射窗口返回地球的动画3D代码

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D# 天体参数设置&#xff08;简化模型&#xff09; AU 1.5e8 # 天文单位&#xff08;公里&#xff09; earth_orbital_radius …...

埃拉托斯特尼筛法来生成素数表【C语言】

代码&#xff1a; char *prime(int MAX) {char *a (char*)malloc(MAX * sizeof(char));if (a NULL) {fprintf(stderr, "Memory allocation failed\n");exit(EXIT_FAILURE);}memset(a, 1, MAX * sizeof(char));a[0] 0;a[1] 0;for (int i 2; i * i < MAX; i) …...

VSCode 实用快捷键

前文 VSCode 作为文本编辑神器, 熟练使用其快捷键更是效率翻倍, 本文介绍 VSCode 常用的实用的快捷键 实用快捷键 涉及到文本操作, 搜索定位, 多光标, 面板打开等快捷键 功能快捷键复制光标当前行 (不需要鼠标选中) Ctrl C 剪切光标当前行 (不需要鼠标选中) Ctrl X 当前行下…...

Ubuntu24.04无脑安装docker(含图例)

centos系统请看这篇 Linux安装Docker教程&#xff08;详解&#xff09; 一. ubuntu更换软件源 请看这篇&#xff1a;Ubuntu24.04更新国内源 二. docker安装 卸载老版docker(可忽略) sudo apt-get remove docker docker-engine docker.io containerd runc更新软件库 sudo a…...

近地面无人机植被定量遥感与生理参数反演

近地面无人机植被遥感是指利用无人机&#xff08;UAV&#xff09;搭载传感器&#xff0c;在低空&#xff08;通常低于 100 米&#xff09;对植被进行高分辨率遥感观测和数据采集的技术。这种技术结合了无人机的高灵活性和遥感的高精度&#xff0c;广泛应用于农业、生态学、林业…...

如何创建自定义权限的kubeconfig

如何创建自定义权限的kubeconfig 有些小伙伴问如何做自定义权限的kubeconfig首先看下我们怎么了解我们控制的权限的api以及涉及的资源和动作权限从哪里可以轻松查看了解了上面的&#xff0c;接下来就简单了&#xff0c;和简单的授权流程一致1、创建一个账户2、创建想要的角色或…...

使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频

如何使用 pjsua2 开发呼叫机器人,批量拨打号码并播放固定音频 声明 该播客仅提供实现思路,并非实际的方案记录,不要盲目照搬。 pjsua2库的安装会有较多问题,请参考本人之前的播客进行安装 pjsua2。 pjsua2 库具体的 api 说明请参考开源库内的 范例代码。 引言 在今天的…...

使用nvm管理node.js版本,方便vue2,vue3开发

在Vue项目开发过程中&#xff0c;我们常常会遇到同时维护Vue2和Vue3项目的情况。由于不同版本的Vue对Node.js 版本的要求有所差异&#xff0c;这就使得Node.js 版本管理成为了一个关键问题。NVM&#xff08;Node Version Manager&#xff09;作为一款强大的Node.js 版本管理工具…...

Breakout Tool

思科 CML 使用起来还是很麻烦的&#xff0c;很多操作对于习惯了 secure crt 或者 putty 等工具的网络工程师都不友好。 Breakout Tool 提供对远程实验室中虚拟机控制台与图形界面的本地化接入能力&#xff0c;其核心特性如下&#xff1a; Console 访问&#xff1a;基于 Telnet…...

网络安全-攻击流程-用户层

用户层攻击主要针对操作系统中的用户空间应用程序及用户权限&#xff0c;利用软件漏洞、配置错误或用户行为弱点进行攻击。以下是常见的用户层攻击类型及其流程&#xff0c;以及防御措施&#xff1a; 1. 缓冲区溢出攻击 攻击流程&#xff1a; 目标识别&#xff1a;确定存在漏…...

内网下,Ubuntu (24.10) 离线安装docker最新版教程

一般在数据比较敏感的情况下&#xff0c;是无法使用网络的&#xff0c;而对于Ubuntu系统来说&#xff0c;怎么离线安装docker呢&#xff1f; 下面我给大家来讲一下&#xff1a; 采用二进制安装&#xff1a; 1.下载docker离线包 官网下载&#xff1a; Index of linux/static…...

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…...

6.【线性代数】—— 列空间和零空间

六 列空间和零空间 1. 列空间 C(A)2. 零空间 N(A)2.1 定义2.2 为什么零空间是一个子空间&#xff1f;2.3 Axb的解空间&#xff0c;是一个子空间吗&#xff1f; 1. 列空间 C(A) [ c o l 11 c o l 21 c o l 31 c o l 12 c o l 22 c o l 32 c o l 13 c o l 23 c o l 33 ] ⏟ A [ a…...

Spring SmartLifecycle:精准控制Bean的生命周期

一、核心作用 SmartLifecycle 是 Spring 框架中用于 精确控制组件生命周期阶段 的高级接口&#xff0c;主要解决三类问题&#xff1a; 有序启停&#xff1a;控制多个组件启动/关闭顺序阶段化处理&#xff1a;将初始化/销毁操作划分为不同阶段上下文感知&#xff1a;获取应用上…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...

gitee SSH 公钥设置教程

Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库仓库之前,需要先配置好账户 SSH 公钥。 1、生成秘钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 ssh-keygen -t ed25519 -C "Gitee SSH Key"中间…...

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…...

electron 学习

文章目录 1.注意项1.1 安装前最好设置一下代理 官网 tutorial https://www.electronjs.org/docs/latest/tutorial/tutorial-prerequisites 1.注意项 1.1 安装前最好设置一下代理 npm config set registry https://registry.npmmirror.com/...

Asp.Net Core MVC 中级开发教程

Asp.Net Core MVC 中级开发教程 一、Asp.Net Core Mvc 区域使用 ASP.NET Core MVC的Areas使用整理 - 天马3798 - 博客园 二、Asp.Net Core 路径处理 Asp.Net Core Web相对路径、绝对路径整理 Asp.Net Core获取当前上下文对象 三、Asp.Net Core 服务使用和封装 四、Asp.Net …...

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…...

什么是网络安全?网络安全防范技术包括哪些?

伴随着互联网的发展&#xff0c;它已经成为我们生活中不可或缺的存在&#xff0c;无论是个人还是企业&#xff0c;都离不开互联网。正因为互联网得到了重视&#xff0c;网络安全问题也随之加剧&#xff0c;给我们的信息安全造成严重威胁&#xff0c;而想要有效规避这些风险&…...

使用Java爬虫获取1688按图搜索商品(拍立淘API接口)

在电商领域&#xff0c;按图搜索商品&#xff08;拍立淘&#xff09;是一种非常实用的功能&#xff0c;尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口&#xff0c;允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Java爬虫技术…...

物联网技术赋能预测性维护的深度剖析与前景展望

一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,物联网技术已逐渐渗透到各个行业领域,成为推动产业变革和创新的重要力量。物联网通过将各种设备、物品与互联网连接,实现数据的采集、传输和交互,为各行业带来了前所未有的智能化和自动化水平提升。在工业领域,设备…...

前端工程化的具体实现细节

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Dav_笔记14:优化程序提示 HINTs -4

指定全局表提示 指定表的提示通常是指发生提示的DELETE&#xff0c;SELECT或UPDATE查询块中的表&#xff0c;而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示&#xff0c;Oracle建议使用全局提示&#xff0c;而不是在视图中嵌入提示。 您可以使用包含具…...

解锁享元模式:内存优化与性能提升的关键密码

系列文章目录 待后续补充~~~ 文章目录 一、享元模式初相识二、享元模式的核心概念2.1 内部状态与外部状态2.2 享元角色剖析 三、Java 代码中的享元模式3.1 简单示例代码实现3.2 代码解析与关键步骤 四、实际应用场景探秘4.1 文本编辑器中的享元模式4.2 游戏开发中的享元模式4.3…...

负载均衡 方式

DNS 软件负载均衡 Nginx 也是 软件负载均衡 各种策略 1、轮询&#xff08;默认&#xff09; 2、weight&#xff08;权重&#xff09; 3、IP Hash &#xff08;会话粘滞&#xff09; 4、fair 5、UrlHash...

CAS单点登录(第7版)18.日志和审计

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具&#xff0c;用于记录重要信息事件&#xff0c;如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...

Linux多版本管理工具介绍

一、update-alternatives工具 1. 简介 update-alternatives是Linux系统自带的一个用于管理多个版本命令的工具。它允许用户在不同的软件版本之间进行切换&#xff0c;而不需要手动修改环境变量或者链接文件。 2. 基本使用 查看已安装的alternatives 使用命令update-alterna…...

DeepSeek笔记(二):DeepSeek局域网访问

如果有多台电脑&#xff0c;可以通过远程访问&#xff0c;实现在局域网环境下多台电脑共享使用DeepSeek模型。在本笔记中&#xff0c;首先介绍设置局域网多台电脑访问DeepSeek-R1模型。 一、启动Ollama局域网访问 1.配置环境变量 此处本人的操作系统是Windows11&#xff0c;…...

摄像头畸变矫正

简单介绍 所谓畸变其实就是由摄像头引起的图片失真, 一般在广角摄像头表现明显, 原本平整的桌面通过镜头看像个球面, 直观的解释直线被拍成了曲线, 这让我想起来了一个表情包. 去畸变的办法 首先我们需要一个标准棋盘(印有特定的标定图案), 如图: 把它摊平放在桌子上, 然后用…...

EasyRTC:智能硬件适配,实现多端音视频互动新突破

一、智能硬件全面支持&#xff0c;轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术&#xff0c;无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统&#xff0c;并全面拥抱 WebRTC 标准。这一特性确保了“一次开发&#xff0c;多端运行”的便捷性&#xff0c…...

机器视觉--图像的运算(乘法)

一、引言 在图像处理领域&#xff0c;Halcon 是一款功能强大且广泛应用的机器视觉软件库。它提供了丰富的算子和工具&#xff0c;能够满足各种复杂的图像处理需求。图像的乘法运算作为其中一种基础操作&#xff0c;虽然不像一些边缘检测、形态学处理等操作那样被频繁提及&…...

蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)

Day 5&#xff1a;哈希表应用&#xff08;两数之和、重复元素判断&#xff09; 一、哈希表&#xff08;Hash Table&#xff09;基础 1. 什么是哈希表&#xff1f; 哈希表&#xff08;Hash Table&#xff09; 是一种键值对&#xff08;key-value&#xff09;存储的数据结构&…...

Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析

#作者&#xff1a;孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数&#xff08;扩缩容副本&#xff09;1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...

vue 接口传formdata

在Vue中&#xff0c;如果你需要向服务器发送FormData对象&#xff0c;通常是为了上传文件或者需要发送表单数据。FormData是一个非常有用的工具&#xff0c;因为它可以直接使用表单元素的值以及文件内容&#xff0c;并以一种浏览器兼容的方式来发送这些数据。下面是如何在Vue中…...

图像处理篇---基本OpenMV图像处理

文章目录 前言1. 灰度化&#xff08;Grayscale&#xff09;2. 二值化&#xff08;Thresholding&#xff09;3. 掩膜&#xff08;Mask&#xff09;4. 腐蚀&#xff08;Erosion&#xff09;5. 膨胀&#xff08;Dilation&#xff09;6. 缩放&#xff08;Scaling&#xff09;7. 旋转…...

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...

数据融合的经典模型:早期融合、中期融合与后期融合的对比

数据融合是处理多源数据时非常重要的技术&#xff0c;尤其是在多模态学习、传感器网络和智能系统中。它的目标是将来自不同来源、不同模态的数据进行有效结合&#xff0c;从而获得更准确、更全面的信息。在数据融合的过程中&#xff0c;不同的融合策略能够在性能、效率和应用场…...