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

uniapp Vue3 语法实现浏览器中音频录制、停止、保存、播放、转码、实时音频输出

一、引言

在现代 Web 应用开发中,音频处理功能变得越来越重要。本文将详细介绍如何使用 uniapp 结合 Vue3 语法在浏览器环境中实现音频录制、停止、保存、播放、转码以及实时音频输出等一系列功能。通过深入剖析代码结构和功能实现细节,帮助读者全面理解和掌握相关技术,以便在自己的项目中应用或进行进一步的拓展和优化。

二、代码整体结构概述

这段代码是一个 Vue3 组件的模板和脚本部分,用于在 uniapp 项目中实现音频录制相关功能。模板部分包含了用于控制音频录制、停止、播放的按钮,以及显示音频 Base64 数据和音频频率进度条的元素。脚本部分则通过引入 Vue3 的相关函数和对象,定义了一系列变量和函数来实现音频录制的核心逻辑,包括获取音频流、实例化媒体录制器、处理录制数据、分析音频频率、转换音频格式以及与界面元素的交互等。

三、详细功能实现解析

(一)数据变量定义

  1. audioBase64:使用 ref 函数创建的响应式数据,用于存储音频的 Base64 编码数据,初始值为空字符串。它将在音频录制完成并转换为 Base64 格式后被赋值,以便在界面上显示或进行其他处理。
  2. mediaRecorder:用于存储媒体录制器实例。通过 navigator.mediaDevices.getUserMedia 获取音频流后,利用该实例来启动和停止音频录制,并处理录制过程中产生的数据块。
  3. audioStream:存储获取到的音频流对象。该音频流是从用户设备的音频输入设备(如麦克风)获取的,是后续音频录制和分析的基础数据来源。
  4. audioContextAudioContext 实例,用于创建和管理音频处理节点,如音频分析器等。它提供了对音频硬件的访问和音频处理的上下文环境。
  5. analyser:音频分析器实例,通过 audioContext.createAnalyser 创建。它用于对音频流进行分析,获取音频的频率数据等信息,以便实现实时音频输出(如进度条显示音频频率变化)。
  6. isRecording:布尔类型的响应式数据,标记当前是否正在进行音频录制,初始值为 false。通过该变量控制录制按钮的禁用状态,避免重复录制操作。
  7. hasRecorded:布尔类型的响应式数据,标记是否已经有录制的音频内容,初始值为 false。用于控制播放音频按钮的禁用状态,只有在有录制内容后才能播放。
  8. frequencyProgress:响应式数据,用于存储音频频率对应的进度条进度值,初始值为 0。根据音频分析器获取的频率数据进行映射和更新,以在界面上直观地展示音频频率的变化情况。
  9. recordedChunks:数组,用于存储每次录制的音频数据块。在录制过程中,媒体录制器的 ondataavailable 事件会将数据块添加到该数组中,最后用于生成完整的音频 Blob 对象。
  10. audioContextClosed:布尔变量,标记 AudioContext 是否已经关闭,初始值为 false。用于避免重复关闭 AudioContext 导致的错误。
  11. halfSecondUpdateIntervalId:用于存储每 0.5 秒更新频率的定时器标识。通过该标识可以在合适的时候清除定时器,避免定时器的累积和不必要的资源占用。

(二)音频录制功能 - startRecording 函数

  1. 首先,函数会检查当前是否已经在录制音频,如果 isRecording.valuetrue,则直接返回,不进行重复录制操作。
  2. 若未在录制,则调用 resetRecordingData 函数重置录制相关数据。这个函数会清空 recordedChunks 数组,将 hasRecorded.value 设置为 false,关闭 audioContext(如果未关闭)并断开 analyser 的连接,同时将 frequencyProgress.value 设置为 0。这样做的目的是为了确保每次新的录制都是在一个干净的状态下开始,清除之前录制可能留下的残留数据和状态。
  3. 接着使用 navigator.mediaDevices.getUserMedia 方法获取音频流,传入的参数 { audio: true } 表示只获取音频设备的媒体流。如果获取成功,将音频流赋值给 audioStream 变量,并在控制台打印获取到的音频流信息。然后创建 MediaRecorder 实例,传入获取到的音频流,并启动录制,即 mediaRecorder.start()
  4. mediaRecorderondataavailable 事件注册回调函数,当有可用的音频数据块时,会触发该事件。在回调函数中,判断数据块的大小是否大于 0,如果是,则将数据块添加到 recordedChunks 数组中,用于后续生成完整的音频文件。
  5. 调用 initAudioAnalyzer 函数初始化音频分析器,传入获取到的音频流作为参数。这个函数将在后面详细介绍,它主要用于创建音频分析器实例,并设置相关参数,以及启动定时器来定期更新音频频率数据并反映在进度条上。
  6. 最后,将 isRecording.value 设置为 true,表示当前正在录制音频,同时界面上的“开始录制”按钮将被禁用,“停止录制”按钮将被启用。

(三)音频分析器初始化 - initAudioAnalyzer 函数

  1. 首先检查 audioContextClosed 变量,如果已经关闭,则直接返回,不再进行初始化操作,避免重复创建和初始化音频分析器导致的错误。
  2. 创建 AudioContext 实例并赋值给 audioContext 变量,通过 audioContext.createMediaStreamSource 方法从传入的音频流创建音频源,并连接到音频分析器 analyser
  3. 设置音频分析器的参数,如 fftSize 设置为 2048,这个参数决定了频率分析的精度和分辨率。然后获取分析器的频率数据缓冲区长度 bufferLength,并创建一个 Uint8Array 类型的数组 dataArray 用于存储频率数据。
  4. 定义了一个名为 updateFrequency 的函数,用于每秒更新一次音频频率数据。在这个函数中,首先通过 analyser.getByteFrequencyData 方法获取当前音频的频率数据并存储到 dataArray 中,然后计算频率数据的总和 sum,并求出平均频率值 average。接着将平均频率值进行映射处理,将其转换为适合进度条显示的值 mappedValue,通过 Math.min 函数确保该值不超过 100,并使用 Math.round 函数进行四舍五入取整。最后在控制台打印原始平均频率值和映射后的进度条值。通过 setInterval 函数以每秒一次的频率调用 updateFrequency 函数,并将定时器的标识存储在 intervalId 变量中,以便在录制停止时清除该定时器。
  5. mediaRecorderonstop 事件注册回调函数,在录制停止时,清除之前创建的每秒更新频率的定时器。
  6. 新增了一个每 0.5 秒更新频率的定时器逻辑。通过 setInterval 函数创建一个定时器,每隔 0.5 秒执行一次匿名函数。在匿名函数中,同样获取音频频率数据并计算平均频率值和映射后的进度条值,然后直接将映射后的进度条值赋值给 frequencyProgress.value,这样就可以实现进度条根据音频频率实时跳动的效果。将这个定时器的标识存储在 halfSecondUpdateIntervalId 变量中,以便在后续停止录制或其他合适的时机清除该定时器。

(四)音频停止录制功能 - stopRecording 函数

  1. 首先检查 mediaRecorder 是否存在且当前状态是否为“recording”(正在录制),如果满足条件,则调用 mediaRecorder.stop() 停止录制。
  2. mediaRecorderonstop 事件注册回调函数,在录制停止后执行以下操作:
    • 遍历 audioStream 的所有音频轨道,并调用 stop 方法停止音频流,释放音频设备资源。
    • 如果 audioContext 存在且未关闭,调用 audioContext.close() 方法关闭音频上下文,将 audioContextClosed 设置为 true,表示音频上下文已关闭,避免重复关闭操作。
    • 如果 analyser 存在,调用 analyser.disconnect() 方法断开音频分析器与音频源的连接,释放相关资源。
    • 调用 convertAudioToBase64 函数将录制的音频数据转换为 Base64 格式,并存储在 audioBase64.value 中,以便在界面上显示音频数据。
    • isRecording.value 设置为 false,表示录制已停止,“开始录制”按钮将被启用,“停止录制”按钮将被禁用;将 hasRecorded.value 设置为 true,表示已经有录制的音频内容,“播放音频”按钮将被启用;将 frequencyProgress.value 设置为 0,重置进度条。
    • 最后,清除每 0.5 秒更新频率的定时器,通过 clearInterval 函数传入 halfSecondUpdateIntervalId 来实现。

(五)音频播放功能 - playAudio 函数

  1. 使用 recordedChunks 数组创建一个 Blob 对象,指定类型为 audio/mp3,表示创建的 Blob 是一个音频文件,格式为 MP3。
  2. 通过 URL.createObjectURL 方法创建一个对象 URL,该 URL 指向创建的音频 Blob 对象,以便在浏览器中播放音频。
  3. 创建一个 Audio 元素实例,传入创建的对象 URL,然后调用 play 方法播放音频,从而实现播放录制的音频功能。

(六)音频转换为 Base64 功能 - convertAudioToBase64 函数

  1. 创建一个 FileReader 实例,用于读取文件数据并转换为特定格式。
  2. 使用 recordedChunks 数组创建一个音频 Blob 对象,类型为 audio/mp3
  3. FileReaderonloadend 事件注册回调函数,当读取操作完成时,将读取结果(即音频的 Base64 编码数据)赋值给 audioBase64.value,以便在界面上显示音频的 Base64 数据。
  4. 如果音频 Blob 对象存在,调用 reader.readAsDataURL 方法开始读取音频数据并转换为 Base64 格式。

(七)生命周期钩子函数

  1. onMounted:在组件挂载时执行的生命周期钩子函数,目前该函数体为空,可根据实际需求在组件挂载后进行一些初始化操作,如设置界面元素的初始状态或注册一些全局事件监听等。
  2. onUnmounted:在组件卸载时执行的生命周期钩子函数。在该函数中,如果 audioStream 存在,遍历其音频轨道并停止音频流,释放音频设备资源;如果 audioContext 存在且未关闭,调用 audioContext.close() 方法关闭音频上下文,确保在组件卸载时清理所有与音频相关的资源,避免内存泄漏和其他潜在问题。

四、代码的优势与可扩展性

  1. 功能完整性:该代码实现了音频录制的完整流程,包括开始录制、停止录制、播放录制音频、将音频转换为 Base64 格式以及实时音频频率分析和进度条展示等功能,能够满足大多数基本的音频处理需求。
  2. 实时反馈:通过音频分析器和定时器的配合,实现了音频频率的实时分析和进度条的实时更新,为用户提供了直观的音频录制状态反馈,增强了用户体验。
  3. 可扩展性:代码结构相对清晰,各个功能模块相对独立,易于进行扩展和修改。例如,可以进一步优化音频分析算法,增加更多音频特效处理功能,或者与后端服务器进行交互,将录制的音频上传到服务器进行存储或进一步处理等。
  4. 兼容性:基于浏览器的标准 API(如 navigator.mediaDevices.getUserMediaMediaRecorderAudioContext 等)实现,在现代主流浏览器中具有较好的兼容性,可以方便地应用于各种基于浏览器的项目中,无论是桌面端还是移动端浏览器。

五、可能的优化方向

  1. 错误处理增强:目前代码中虽然对获取音频设备权限失败等错误进行了简单的控制台打印处理,但可以进一步完善错误处理机制,例如向用户显示友好的错误提示信息,引导用户检查设备设置或权限配置等。
  2. 音频格式支持多样化:目前代码中仅将录制的音频转换为 MP3 格式并进行处理,如果需要支持更多音频格式(如 WAV、OGG 等),可以进一步扩展代码,根据用户需求或系统配置动态选择音频格式进行处理。
  3. 性能优化:在音频分析和定时器操作过程中,可能会存在一定的性能开销,尤其是在处理长时间录制或高频率音频数据时。可以考虑优化音频分析算法,减少不必要的计算和数据处理,或者采用更高效的定时器管理策略,避免定时器累积和频繁触发导致的性能问题。

相关文章:

uniapp Vue3 语法实现浏览器中音频录制、停止、保存、播放、转码、实时音频输出

一、引言 在现代 Web 应用开发中,音频处理功能变得越来越重要。本文将详细介绍如何使用 uniapp 结合 Vue3 语法在浏览器环境中实现音频录制、停止、保存、播放、转码以及实时音频输出等一系列功能。通过深入剖析代码结构和功能实现细节,帮助读者全面理解和掌握相关技术,以便…...

OSPF的基本配置

基本原理图 1. 要求: R1-3为区域0,R3-R4为区域1;其中r3的环回也在区域0。R1,R2也各有一个环回 R1-R3 R3为DR设备,没有BDR R4环回地址以固定,其他所有网段使用192.168.1.0/24进行合理的分配 R4环回不能宣告&#xff0…...

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互

前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...

【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现

一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…...

全局JDK环境和ES自带的JDK混用导致的ES集群创建失败

es配置安全集群es使用的自带的jdk环境,如果服务器全局在有jdk的配置。会导致秘钥解析出问题。各种问题异常密钥解析异常。 错误日志1: [2024-12-20T17:10:44,700][WARN ][o.e.c.c.ClusterFormationFailureHelper] [es-node1] master not discovered yet…...

vmime.net_4.dll详解:它是什么,有何用途?

在.NET开发环境中,DLL(Dynamic Link Library,动态链接库)文件扮演着至关重要的角色。它们封装了代码和资源,使得多个应用程序可以共享这些功能,从而提高开发效率和代码复用性。本文将详细介绍vmime.net_4.d…...

K8s 节点 NotReady 后 Pod的变化

NotReady 后 Pod的变化 当Kubernetes(K8s)节点进入NotReady状态时,该节点将无法接收新的Pod调度,这可能会影响服务的可用性。以下是节点变为NotReady后,其上Pod状态可能发生的一些情况和细节: Pod状态变为…...

使用 esrally race 测试 Elasticsearch 性能:实践指南

在 Elasticsearch 性能优化和容量规划中,使用 esrally 进行基准测试是官方推荐的方式。通过 esrally race 命令,您可以针对不同的数据集与挑战类型,对 Elasticsearch 集群进行精确的性能评估。本文将简要介绍常用的数据集与挑战类型&#xff…...

对象、函数、原型之间的关系

在 JavaScript 中,对象、函数 和 原型 是三者紧密联系的核心概念。它们共同构成了 JavaScript 中面向对象编程的基石,并通过原型链实现了继承与代码复用。本文将从对象、函数、原型的基础概念到它们之间的关系进行详细的讲解,帮助你理解 Java…...

Showrunner AI技术浅析(二):大型语言模型

1. GPT-3模型架构详解 GPT-3是基于Transformer架构的预训练语言模型,由OpenAI开发。其核心思想是通过自注意力机制(Self-Attention)处理输入序列,并生成自然语言文本。 1.1 Transformer架构基础 Transformer架构由Vaswani等人在…...

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…...

买卖股票的最佳时机 - 合集

************* C 买卖股票问题合集 ************* Since I have finished some stocks problems. I wanna make a list of the stocks to figure out the similarities. Here is the storks topucs list, from easy to hard: 121. 买卖股票的最佳时机 - 力扣(L…...

gitlab window如何设置ssh

在GitLab中设置SSH需要以下步骤: 在GitLab账户中,导航到“用户设置”下的“SSH密钥”部分。 生成SSH密钥对(如果你还没有的话)。在Windows上,你可以使用ssh-keygen命令来生成密钥。 在命令提示符或PowerShell中运行以…...

go配置文件

https://github.com/spf13/viper viper golang中常用的配置文件工具为viper库,是一个第三方库。viper功能: 解析JSON、TOML、YAML、HCL等格式的配置文件。监听配置文件的变化(WatchConfig),不需要重启程序就可以读到最新的值。...

深度学习之超分辨率算法——SRGAN

更新版本 实现了生成对抗网络在超分辨率上的使用 更新了损失函数,增加先验函数 SRresnet实现 import torch import torchvision from torch import nnclass ConvBlock(nn.Module):def __init__(self, kernel_size3, stride1, n_inchannels64):super(ConvBlock…...

GIT命令使用手册(详细实用版)

一、git常用操作参考 第一次提交完整步骤: 1.git init; 2.git add . 3.git commit -m "初始化" 4.git remote add origin https://github.com/githubusername/demo.git 5.git pull origin master 6.git push -u origin master(使用-u选项可以将…...

数据分析实战—IMDB电影数据分析

1.实战内容 1.加载数据到movies_df,输出前5行,输出movies_df.info(),movies_df.describe() # (1)加载数据集,输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...

【SQL/MySQL 如何使用三种触发器】SQL语句实例演示

触发器介绍 – 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只…...

社区团购管理系统(源码+数据库)

355.基于SpringBoot的社区团购管理系统,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术:Vue …...

时钟分频模块

实现时钟的二分频,四分频 1.时钟分频模块: module clk_div(input clk, //50Mhzinput rst_n,input [15:0] lcd_id,output reg lcd_pclk);reg clk_25m; reg clk_12_5m; reg …...

linux ipmitool配置机器的BMC(服务器管理后台)

前置:mgnt口和网卡1连接入内网,并分配静态ip 1. 安装 ipmitool Debian/Ubuntu: sudo apt-get update sudo apt-get install ipmitool CentOS/RHEL: sudo yum install ipmitool2. 配置 BMC 的 IP 地址 #打印当前ipmi 地址配置信息。 ipmitool lan p…...

【Springboot知识】Redis基础-springboot集成redis相关配置

文章目录 1. 添加依赖2. 配置Redis连接3. 配置RedisTemplate(可选)4. 使用RedisTemplate或StringRedisTemplate5. 测试和验证 集群配置在application.properties中配置在application.yml中配置 主从配置1. 配置Redis服务器使用配置文件使用命令行 2. 配置…...

【数据结构】八大排序

目录 一、直接插入排序 二、希尔排序 三、选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序 八、计数排序 稳定性结论 稳定性:排序后相同元素之间的相对顺序是否保持不变。 一、直接插入排序 基本思想:通过构建有序序列&#xff…...

mmdetection:图片推理以及将预测标签转换为YOLO格式标签

本文记录了使用 mmdetection 进行图片推理,并将推理结果坐标格式转换为yolo格式保存在txt中的代码。 文章目录 一、图片推理二、批量处理 一、图片推理 一个图片推理的demo。 import os import mmcv from mmdet.apis import init_detector, inference_detector fr…...

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接: An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…...

从混沌到秩序:Python的依赖管理工具分析

Python 的依赖管理工具一直没有标准化,原因主要包括: 历史发展的随意性:Python发展早期对于依赖管理的重视程度不足,缺乏从一开始就进行统一规划和设计的意识 社区的分散性:Python社区庞大且分散,众多开发…...

【系统】Windows11更新解决办法,一键暂停

最近的windows更新整的我是措不及防,干啥都要关注一下更新的问题,有的时候还关不掉,我的强迫症就来了,非得关了你不可! 经过了九九八十一难的研究之后,终于找到了一个算是比较靠谱的暂停更新的方法&#x…...

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书

小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书 一、下载影刀: https://www.winrobot360.com/share/activity?inviteUserUuid595634970300317698 二、加入应用市场 https://www.yingdao.com/share/accede/?inviteKeyb2d3f22a-fd6c-4a…...

【原生js案例】前端封装ajax请求及node连接 MySQL获取真实数据

上篇文章,我们封装了ajax方法来请求后端数据,这篇文章将介绍如何使用 Node.js 来连接 MySQL,并对数据库进行操作。 实现效果 代码实现 后端接口处理 const express require("express"); const connection require("../da…...

Ubuntu将深度学习环境配置移植到新电脑

这里默认新电脑已经安装好了conda、CUDA这些,可以直接创建新的虚拟环境。 参考链接: https://blog.csdn.net/Chujun123528/article/details/143788565https://blog.csdn.net/qq_41779275/article/details/122868946https://blog.csdn.net/YajunLin/art…...

vue基础作业实验十

vue基础作业实验十 实验要求案例要点:代码以及思考style部分Vue.js 部分Vue 实例部分 这段代码是一个基于 Vue.js 的静态页面,功能包括商品品牌的添加、删除和搜索。 实验要求 一、实验的基本内容 (1)Vue模板语法。 &#xff08…...

冒泡排序(JAVA)

package com.guangyunl.f_array;import java.util.Random; import java.util.Scanner;// 数组的冒泡排序 // 冒泡排序法是采用数组中相邻元素进行比较换位 public class Demo02Bubble {public static void main(String[] args) {Demo02Bubble demo02Bubble new Demo02Bubble()…...

如何测量分辨率

一、什么是分辨率? 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率,但是相机在在不同的对比度的情况下还原低,中和高频率的能力,也可以显示全面综合的信息。…...

【Mysql索引优化】索引优化的最佳实现

文章目录 【Mysql优化】索引优化的最佳实现1. 全值匹配:索引的最佳使用方式2. 最左前缀法则3. 尽量使用覆盖索引:优化查询性能。减少 select \* 语句4. 范围查询优化5. 不在索引列上做任何操作(计算、函数、(自动or手动&#xff0…...

centos使用mkisofs构建无人值守镜像(附官方学习文档)

安装mkisofs yum install -y mkisofs 挂载镜像并确认 并拷贝文件(/mnt 为我们的工作目录) 1.3 准备自动应答文件(保存为 ins.ks) 修改系统引导 实际上就是添加inst.ks 这个引导参数 传递应答文件 传统模式引导 UEFI模式引导 打包镜像 通用选项 -v:启用详细模式&a…...

Python获取当前系统中可用的串口设备

import serial.tools.list_portsdef checkDevice(self):port_data []for port in serial.tools.list_ports.comports():port_data.append(port.description)if port_data:for devInfo in port_data:self.toolLogPrinting(可用设备 devInfo)RET Trueelse:self.toolLogPrinti…...

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮,本次基于蓝牙通信的手机遥控智能灯设计功能如下: (1)用户可以通过蓝牙通信模块的作用下,在手机端遥控切换智能灯不同的工作模式; &#x…...

【Prometheus 】【实战篇(五)】深入解析 Prometheus 监控指标类型:Counter、Gauge、Histogram 和 Summary

Prometheus 提供了四种核心的指标类型,分别是 Counter(计数器)、Gauge(仪表)、Histogram(直方图)和 Summary(摘要)。这些指标类型在客户端库中有具体的使用说明&#xff…...

进程间通信方式---消息队列(System V IPC)

进程间通信方式—消息队列(System V IPC) 文章目录 进程间通信方式---消息队列(System V IPC)消息队列1.消息队列进程间通信原理2.msgget 系统调用3.msgsnd 系统调用4.msgrcv 系统调用5.msgctl 系统调用6.函数使用案例7.实现生产者…...

【笔记】深度学习模型评估指标

推荐链接: (0)多分类器的评价指标 (1)泛化误差的评价方法:【机器学习】模型评估与选择(留出法、交叉验证法、查全率、查准率、偏差、方差) (2)机器学习&…...

Python语法之列表(包含检测练习)

看完后有没有学会呢?主页有一个列表知识小检测^V^ 关注我更新更多初学实例 主页还有字典的,这个系列会持续更新 列表 列表中的查找数据(index,count,len) 一 列表的格式 【数据1,数据2, 】 index():返回指定数据…...

气象与旅游之间的关系,如果借助高精度预测提高旅游的质量

气象与旅游之间存在密切的关系,天气条件直接影响旅游者的出行决策、旅游体验和安全保障。通过高精度气象预测技术,可以有效提升旅游质量,为游客和旅游行业带来显著的优势。 1. 提高游客出行决策效率 个性化天气服务:基于高精度气象预测,旅游平台可以提供个性化的天气预报服…...

JVM(Java虚拟机)分区详情

JVM(Java虚拟机)运行时数据区是Java虚拟机的内存管理模型,它包括了多个关键的内存区域,这些区域各自承担着不同的职责,共同支持着Java程序的运行。以下是JVM运行时数据区的详细介绍: 一、整体概述 JVM运行时数据区按照线程占用的情况可以分为两类:线程共享和线程独享。…...

计算机组成原理的学习笔记(2)--数据表示与运算·其二 逻辑门和加减乘

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 1. 逻辑门 逻辑门是数字电路中用于执行基本逻辑运算的组件。每种逻辑门都有独特的功能和特性: 与门(AND Gate): 符号&#xff1…...

数据科学与SQL:如何利用本福特法则识别财务数据造假?

目录 0 本福特法则介绍 1 数据准备 2 问题分析 步骤1:提取首位数: 步骤2:计算首位数字的实际频率分布 <...

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…...

常见网络命令

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 常见网络命令 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 Ping 命令 …...

Ubuntu上如何部署Nginx?

环境&#xff1a; Unbuntu 22.04 问题描述&#xff1a; Ubuntu上如何部署Nginx&#xff1f; 解决方案&#xff1a; 在Ubuntu上部署Nginx是一个相对简单的过程&#xff0c;以下是详细的步骤指南。我们将涵盖安装Nginx、启动服务、配置防火墙以及验证安装是否成功。 1. 更新…...

微店商品详情API:获取商品信息的高效途径

引言 在电商领域&#xff0c;获取商品详情是开发者和商家进行数据分析、精准营销和店铺管理的重要一环。微店作为知名的电商平台&#xff0c;提供了丰富的API接口供开发者使用&#xff0c;其中商品详情API接口尤为关键。本文将详细介绍如何使用微店API接口获取商品详情&#x…...

编程语言注释的方式

Python 单行注释 # 这是一个单行注释多行注释&#xff08;本质上是跨行字符串&#xff09; 这是一个多行注释的示例。它可以跨越多行。 """这是一个多行注释的示例。它可以跨越多行。 """ C 单行注释 // 这是一个单行注释 多行注释 /*这是…...