1.3.1 Linux音频框架alsa详细介绍
ALSA作为对旧OSS系统的替代方案,始于1998年。当时OSS还闭源商业化,因此社区开始开发开源的ALSA。经过多年的发展,ALSA成为Linux内核中音频架构的标准。
结构和架构
-
ALSA由以下几个主要部分组成:
-
内核模块:
这是ALSA的核心部分,包括声音驱动模块,它们直接与硬件设备沟通。每种声卡通常对应一个独立的内核模块,比如snd-hda-intel用于Intel的HD音频控制器。
内核驱动层:提供硬件抽象,通过 /dev/snd/* 设备节点(如 pcmC0D0p、controlC0)暴露音频硬件能力 -
用户空间库:
用户空间库(alsa-lib):封装底层操作,向上提供统一 API(如 snd_pcm_writei()),隐藏硬件差异
libasound.so或libasound.a是alsa lib编译后生成的用户空间库,它使应用程序能够通过标准接口与音频设备进行交互,而无需直接处理内核模块。这极大简化了音频应用开发过程。 -
实用工具:
ALSA也包括一系列实用工具如aplay(播放音频文件)、arecord(录制音频文件)、amixer(调节混音器设置)。
- 关键模块
模块 功能描述 PCM 管理音频流传输,支持播放(playback)和录音(capture) Control 控制音量、声道切换等参数,通过 /dev/snd/controlC0
节点操作Mixer 实现多路音频混合,支持软件或硬件混音 ASoC 针对嵌入式系统的扩展,优化 Codec、I2S、DMA 集成
代码目录结构简介
-
内核目录结构
sound/pci:
这个目录包含了PCI声卡驱动程序。
你会在这里找到大多数常见声卡的实现代码,比如Intel、Creative等厂商的声卡驱动。
sound/core:
包含了ALSA框架的核心部分。
这里有通用的音频设备管理代码,包括PCM(Pulse-code Modulation),混音器接口以及其他基础服务。
sound/soc:
SOC代表"System on Chip"。这个目录包含了针对嵌入式系统的音频驱动。
大部分嵌入式设备如手机和平板电脑,会在这个目录中找到相关的音频接口代码。
sound/usb:
包含USB声卡的驱动代码。
处理通过USB接口连接的音频设备。
sound/drivers:
这一部分包含了硬件独立的通用驱动代码。
也可能包括一些不太常见的或较老的声卡驱动。
include/sound:
存放ALSA使用的头文件。
这些文件定义了内核模块与音频驱动交互所需的结构和接口。
sound/firewire:
包含通过Firewire接口连接的音频设备的驱动代码。
用于支持Firewire音频设备。 -
用户空间组件
alsa-lib/ 功能:提供用户态 API 库(libasound.so),封装内核驱动操作。
src/pcm/:PCM 设备接口实现(如 snd_pcm_open, snd_pcm_writei)。
src/control/*:控制接口(snd_ctl_open, snd_ctl_elem_read)。
src/mixer/ :混音器抽象层(snd_mixer_* 函数)。
plugins/:插件系统源码(如 plughw, dmix 的实现)。alsa-utils/ 工具集:基于 alsa-lib 的命令行工具。
aplay/ & arecord/:音频播放/录制工具。
amixer/:混音器控制工具。
alsactl/:声卡配置持久化管理。
speaker-test/:音频输出通道测试。alsa-plugins/扩展插件:增强 ALSA 功能。
pulse/:ALSA 到 PulseAudio 的桥接插件。
jack/:支持 JACK 音频连接工具。
rate/:采样率转换插件。
设备文件与接口
-
设备节点示例(
/dev/snd
目录)controlC0 # 控制接口(音量、开关) pcmC0D0p # 播放 PCM 设备(Card 0, Device 0, Playback) pcmC0D1c # 录音 PCM 设备(Card 0, Device 1, Capture)
通过
aplay -l
或cat /proc/asound/cards
查看设备列表 -
音频流传输流程
- 应用层:调用
alsa-lib
API(如snd_pcm_open()
)打开设备,传递 PCM 数据。 - 驱动层:通过 DMA 引擎直接将数据传至 I2S 总线,减少 CPU 负载。
- 硬件层:Codec 芯片完成数模转换(DAC)或模数转换(ADC)。
- 应用层:调用
核心技术与特性
-
动态电源管理(DAPM)
- 智能控制音频组件电源状态(如 Codec、放大器),降低空闲功耗,同时DAPM也是音频组件进行通路切换的组成部分。
-
格式与采样支持
- 音频格式:支持 S16_LE、S24_LE、Float 等,通过
hw_params
配置。 - 采样率:常见 44.1kHz、48kHz,高保真场景支持 192kHz。
- 音频格式:支持 S16_LE、S24_LE、Float 等,通过
-
多声道与路由
- 支持 2.0(立体声)到 7.1 环绕声配置,通过
channel_map
定义声道映射。 - 路由配置(如麦克风输入切换)通过
ctl
接口动态调整。
- 支持 2.0(立体声)到 7.1 环绕声配置,通过
开发与调试
-
开发入门
- 安装工具链:
sudo apt-get install alsa-utils libasound2-dev # 包含调试工具与开发库
- 配置设备:编辑
/etc/asound.conf
指定默认声卡和格式。
- 安装工具链:
-
调试命令
- 播放测试:
如果你播放的格式不被设备硬件直接支持,plughw设备将自动进行音频格式转换和采样率调整再进行播放。aplay -D hw:0,0 test.wav # 指定声卡0和设备0播放音频 aplay -D plughw:0,0 example.wav #使用plughw插件来播放
- 音量控制:
amixer set "Master" 80% # 设置主音量
- 播放测试:
-
常见问题排查
- 设备未识别:检查内核驱动加载(
lsmod | grep snd
)及硬件连接。 - 无声音输出:验证 PCM 设备状态(
cat /proc/asound/card0/pcm0p/sub0/status
)。
- 设备未识别:检查内核驱动加载(
ALSA-Utils 工具详解与常用命令
工具概述
ALSA-Utils 是 ALSA 音频系统的核心工具集,提供用户空间级别的音频设备控制、播放和录制功能。主要包含以下组件:
- amixer:硬件参数控制(音量、声道切换等)
- aplay:音频播放工具
- arecord:音频录制工具
- alsactl:声卡配置持久化工具
- speaker-test:音频输出通道测试工具
核心工具及参数详解
1. amixer - 音频控制工具
-
核心功能
- 调节音量、切换声道、启用/禁用设备组件(如麦克风)
- 查看声卡控制项(
controls
)及硬件参数
-
常用命令
amixer scontrols # 列出所有可调节项 amixer sset 'Master' 80% # 设置主音量为80% amixer sset 'Capture' cap # 启用麦克风录音权限 amixer sget 'PCM' # 查看PCM通道详细参数
2. aplay - 音频播放工具
-
核心参数
参数 功能描述 示例值 -D
指定输出设备(默认 default
)hw:0,0
-f
音频格式(采样位宽) S16_LE
、FLOAT_LE
-r
采样率(Hz) 44100
、48000
-c
声道数 1
(单声道)、2
(立体声)-v
显示详细运行时参数 - -
示例命令
aplay -D hw:0,0 -f S32_LE -r 48000 test.wav # 指定硬件设备播放高精度音频
3. arecord - 音频录制工具
-
核心参数
参数 功能描述 示例值 -d
录制时长(秒) 10
-t
输出文件格式 wav
、raw
-f
采样格式(同 aplay
)S24_3LE
-c
录制声道数 2
-
示例命令
arecord -d 5 -c 1 -f S16_LE -r 16000 test.wav # 录制5秒单声道16kHz音频
4. alsactl - 配置管理工具
- 核心功能
- 保存/恢复声卡配置(如音量、开关状态)
alsactl store # 保存当前配置到/etc/asound.state alsactl restore # 从文件恢复配置
调试与技巧
-
设备查询
aplay -l # 列出所有播放设备 arecord -l # 列出所有录音设备
-
实时状态监控
cat /proc/asound/card0/pcm0p/sub0/status # 查看PCM设备状态
-
采样精度验证
speaker-test -D hw:0,0 -c 2 -twav # 测试立体声输出是否正常
注意事项
- 权限问题:普通用户需加入
audio
组才能操作音频设备 - 格式兼容性:播放/录制前需确认硬件支持的格式(通过
hw_params
查询) - 嵌入式移植:交叉编译时需指定
--with-alsa-prefix
指向目标库路径
补充
在Linux上,音频设备(比如声卡)通常可以通过hw:x,y这样的格式来访问,这里的x代表声卡的编号,y代表设备编号。这种方式直接连接到硬件设备,但硬件设备也有一些限制,比如它可能只支持某些采样率、声道数或音频格式(比如只支持16位的PCM数据)。
plughw提供了一种灵活的方式来处理这些限制。使用plughw:x,y这样的设备名称时,ALSA会自动插入必要的转换插件,以适应音频应用想要使用的格式。这意味着如果你请求的格式不被设备硬件直接支持,plughw设备将自动进行音频格式转换和采样率调整,使得应用程序可以在不需要手动处理这些复杂性的情况下与硬件交互。
相关文章:
1.3.1 Linux音频框架alsa详细介绍
ALSA作为对旧OSS系统的替代方案,始于1998年。当时OSS还闭源商业化,因此社区开始开发开源的ALSA。经过多年的发展,ALSA成为Linux内核中音频架构的标准。 结构和架构 ALSA由以下几个主要部分组成: 内核模块: 这是ALSA的…...
R 语言机器学习:为遥感数据处理开启新视角
技术点目录 基础理论、机器学习与数据准备建模与空间预测实践案例与项目了解更多 ——————————————————————————————————————————— 前言综述 在当今科技快速发展的时代,遥感技术为生态学研究提供了海量的数据资源…...
深度 |提“智”向新,奔向未来——当前机器人产业观察
机器人踏着“猫步”在T台走秀、进入工厂协助造车,教育、医疗、城市管理等领域都有了机器人的帮助……今天,机器人已得到广泛应用,走进你我的生活。 伴随着技术日新月异,机器人产业加快提“智”向新。特别是今年以来…...
Web开发-JavaEE应用SpringBoot栈ActuatorSwaggerHeapDump提取自动化
知识点: 1、安全开发-JavaEE-常见依赖-Actuator&Swagger 2、安全开发-JavaEE-安全问题-配置安全&接口测试 一、演示案例-WEB开发-JavaEE-监控依赖-SpringBoot&Actuator&配置安全 SpringBoot Actuator模块提供了生产级别的功能,比如健康…...
AI Agent开发之门:微软官方课程全面解析
AI Agent开发之门:微软官方课程全面解析 引言项目概览10 节核心课程内容详解1. AI 代理简介及应用场景2. 探索 AI Agentic 框架3. 理解 AI Agentic 设计模式4. 工具使用设计模式5. Agentic RAG(检索增强生成)6. 构建可信赖的 AI Agents7. 规划…...
Unity-Shader详解-其五
关于Unity的Shader部分的基础知识其实已经讲解得差不多了,今天我们来一些实例分享: 溶解 效果如下: 代码如下: Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…...
从零打造个人博客静态页面与TodoList应用:前端开发实战指南
前言 在当今数字时代,拥有个人博客和高效的任务管理工具已成为开发者展示自我和提升生产力的标配。本文将带你从零开始,通过纯前端技术实现一个兼具个人博客静态页面和TodoList任务管理功能的综合应用。无论你是前端新手还是希望巩固基础的中级开发者&a…...
开发者如何优雅应对HTTPS抓包难题
开发者如何优雅应对HTTPS抓包难题:工具实战 深度解析 调试HTTPS接口这件事,真是程序员永远的痛。特别是在移动端、或者遇到客户端集成了第三方安全SDK的项目时,网络调试的门槛几乎成倍提升。你可能也遇到过:Charles不识别证书、…...
Ubuntu 安装远程桌面连接RDP方式
1. 安装 XFCE4 桌面环境 如果你的 Ubuntu 系统默认使用 GNOME 或其它桌面环境,可以安装轻量级的 XFCE4: sudo apt update sudo apt install xfce4 xfce4-goodies 说明:xfce4-goodies 包含额外的插件和工具(如面板插件、终端等&a…...
Ubuntu 22.04 出现 ‘Temporary failure resolving‘ 解决方案
a、使用apt 安装 resolvconf sudo apt-get install resolvconf b、使用 cd /etc/resolvconf/resolv.conf.d/ 进入文件夹,使用 ls 查看目录,会显示 base head tail c、使用 sudo vim base 编辑base文件, 进入时为空,添加 name…...
ubuntu 22.04 换源
参考:清华大学开源软件镜像站 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
Java并发编程几个问题的解答
目录 1、以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗?2、早期的电脑一般是单核CPU,但那时我们就可以在编写程序的同时听歌,你觉得其CPU可以同时执行两个程序…...
JavaScript中数组和对象不同遍历方法的顺序规则
在JavaScript中,不同遍历方法的顺序规则和适用场景存在显著差异。以下是主要方法的遍历顺序总结: 一、数组遍历方法 for循环 • 严格按数组索引顺序遍历(0 → length-1) • 支持break和continue中断循环 • 性能最优,…...
C++ STL入门:set 集合容器
C STL入门:set 集合容器 一、核心特性与适用场景 set 是 C STL 提供的关联式容器,基于红黑树实现,具有两大核心特性: 特性表现形式底层原理元素唯一性重复值自动去重插入时进行二叉树键比对自动排序元素默认升序排列红黑树中序遍…...
[论文笔记] 超详细解读DeepSeek v3全论文技术报告
DeepSeek-V3是一个强大的专家混合(Mixture-of-Experts,MoE)语言模型,总共671B参数,每个token激活37B参数(可以理解为有多个专家,但每个token只会选择一部分专家进行推理,所以一个token的预测,只会用到37B参数),DeepSeek-V3 使用了 多头潜在注意力(...
JS 问号(?)运算符避免中间报错
一、场景 在前端开发过程中,有一些情况比如某些属性可能由于渲染数据的时机不同,一开始是null 或者undifine, 这样访问下面的属性的时候就会报错,我们可以给每个层级后面加个? 就可以避免这个错误。 let data {user: {profile: {name: &q…...
4:点云处理—去噪、剪切、调平
1.点云去噪 dev_clear_window ()dev_open_window(0, 0, 560, 560, black, WindowHandle)GenParamNames : [lut,intensity,light_position,disp_pose,alpha]GenParamValues : [color1,coord_z,0.0 0.0 -0.3 1.0,true,1]DispPose : [0,-0.0005,717.04,280,0,20,0]Instructions[0]…...
机器学习实操 第二部分 神经网路和深度学习 第17章 编码器、生成对抗网络和扩散模型
机器学习实操 第二部分 神经网路和深度学习 第17章 编码器、生成对抗网络和扩散模型 内容概要 第17章深入探讨了自编码器(Autoencoders)、生成对抗网络(GANs)和扩散模型(Diffusion Models)。这些模型能够…...
【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 ISBN号码(模拟)kotori和迷宫(BFS最短路)矩阵最长递增路径(dfs) ISBN号码(模拟) ISBN号码 #include <iostream> #incl…...
【记录】HunyuanVideo 文生视频工作流
HunyuanVideo 文生视频工作流指南 概述 本指南详细介绍如何在ComfyUI中使用腾讯混元HunyuanVideo模型进行文本到视频生成的全流程操作,包含环境配置、模型安装和工作流使用说明。 参考:https://comfyui-wiki.com/zh/install/install-comfyui/install-c…...
DevExpressWinForms-布局之TablePanel
布局之TablePanel 在 DevExpress 的控件库中,TablePanel 是一个功能强大且灵活的布局控件,它能够以表格形式组织和排列其他控件,让界面布局更加规整、有序。无论是开发复杂的企业级应用程序,还是设计简洁美观的用户界面ÿ…...
MySQL 数据库初体验
目录 1.1 数据库简介 1.1.1 使用数据库的必要性 1.1.2 数据库的基本概念 1.数据 2.数据库和数据库表 3.数据库管理系统和数据库系统 1.1.3 数据库发展史 1.数据库系统发展史 (1)初级阶段——第一代数据库 (2)中级阶段—…...
flink超时未揽收单量统计
应用场景: 双十一大屏统计 - - 订单超时汇总 项目指标概况: 应用背景:晚点超时指标,例如:出库超6小时未揽收订单量 难点:flink消息触发式计算,没有消息到达则无法计算,而这类指标…...
【造包工具】【Xcap】精讲Xcap构造分片包(IPv4、ipv6、4G\5G等pcap均可),图解超赞超详细!!!
目录 前言 1. XCap工具概念介绍 2. Xcap环境说明 2.1 新建报文组 2.2 导入数据包 2.3 查看报文组 2.4 复制删除报文组 3. 构造分片包 3.1 造普通/外层分片步骤: 3.2 造内层分片步骤 3.2.1 建立一个新报文 3.2.2 将组装的新报文分片 3.2.3 替换原始包内层…...
RabbitMQ学习(第二天)
文章目录 1、生产者可靠性①、生产者重连②、生产者确认 2、MQ可靠性①、数据持久化②、LazyQueue(惰性队列) 3、消费者可靠性①、消费者确认②、失败重试机制③、保证业务幂等性 总结 之前的学习中,熟悉了java中搭建和操作RabbitMQ发送接收消息,熟悉使用…...
旧版 Flutter 写的项目, 想要在新的环境上运行?
DeepSeek 给出的最佳实践 以下是针对拷贝 Flutter 项目到新环境运行的 完整检查清单和最佳实践,覆盖了环境配置、版本兼容性、依赖管理等多个关键点: 📋 完整检查清单 检查项操作方式/命令重要性1. Flutter SDK 版本flutter --version 对比…...
Flutter接入ProtoBuff和原生Android通信【性能最优】
Protocol Buffers(简称Protobuf)是由 Google 开发的一种结构化数据序列化框架,旨在实现高效的数据交换与存储。其核心特性及优势如下: 一、核心特性 跨语言与跨平台 支持多种编程语言(如 C、Java、Python、Dart …...
【MySQL】(10)用户和权限管理
一、应用场景 通常一个应用对应一个数据库,我们希望某个数据库只能被相关人员操纵,就需要创建用户并指定权限。只有登录该用户,才能在权限范围内操纵数据库。root 是权限最高的用户,它拥有所有的权限。 二、查询用户 在 mysql 数…...
学成在线之缓存
一:缓存 把白名单可以看到的信息和学生用户下的我的学习,我的选课等这些信息,存到缓存中,因为这些查询量比较大。 当查询时,先去检查缓存中是否有这个数据,如果有,就直接返回 如果没有&#…...
视频编解码学习8之视频历史
视频技术的发展历史可以追溯到19世纪,至今已跨越近200年。以下是视频技术发展的主要阶段和里程碑: 1. 早期探索阶段(19世纪-1920年代) 1832年:约瑟夫普拉托(Joseph Plateau)发明"费纳奇镜&…...
从装饰器出发,优雅处理 UI 自动化中的异常
二、装饰器核心原理:函数式编程的“语法糖” 在 UI 自动化测试的实际场景中,页面加载超时、元素定位失败、网络波动等异常问题频繁出现。传统的try-except嵌套方式虽然能捕获异常,但会导致业务代码与处理逻辑高度耦合,造成代码冗…...
华为首款鸿蒙电脑正式亮相
在2025年5月8日的鸿蒙电脑技术与生态沟通会上,华为终端BG平板与PC产品线总裁朱懂东发表演讲。鸿蒙办公将支持无缝协同(统一账户 / 多端同步)、智慧体验(鸿蒙 AI / 智慧交互)、融合生态(桌面生态 / 移动生态…...
森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...
需求分析阶段测试工程师主要做哪些事情
在软件测试需求分析阶段,主要围绕确定测试范围、明确测试目标、细化测试内容等方面开展工作,为后续测试计划的制定、测试用例的设计以及测试执行提供清晰、准确的依据。以下是该阶段具体要做的事情: 1. 需求收集与整理 收集需求文档&#x…...
IBM BAW(原BPM升级版)使用教程第五讲
结前篇! 一、服务:外部服务 在 IBM Business Automation Workflow (BAW) 中,外部服务(External Services)是指在流程中调用和集成外部系统或服务的组件。外部服务允许IBM BAW与其他业务系统、应用程序或第三方服务进行…...
一个用C#开发的记事本Notepads开源编辑器
从零学习构建一个完整的系统 推荐一个用C#开发的,模仿Nodepad的记事本编辑器。 项目简介 这是一个国人开发的,采用Fluent Design风格,支持Markdown语法及其预览,可以用于替代Windows自带记事本功能。 虽然它没有Nodepad、VS C…...
Office宏病毒钓鱼-打点突破
Office宏钓鱼 [攻击路径] / [利用流程] - 详细步骤:制作一个简单的Word宏钓鱼文档 步骤一:规划恶意宏功能 (Payload Design) 目的: 决定宏执行后要达成的目标。为教学演示,我们设定一个简单的目标:弹出一个消息框&…...
神经网络—感知器、多层感知器
文章目录 前言一、生物神经元与感知器的类比二、感知器1、简单感知器2、多层感知器(1)多层感知机结构 3、神经网络结构 总结1、感知器的局限性如何突破感知器的局限性? 2、感知器的应用 前言 感知器(Perceptron)是神经…...
美化IDEA注释:Idea 中快捷键 Ctrl + / 自动注释的缩进(避免添加注释自动到行首)以及 Ctrl + Alt + l 全局格式化代码的注释缩进
打开 Settings 界面,依次选择 Editor -> Code Style -> Java,选择 Code Generation, 取消 Line comment at first column 和 Block comment at first column 的勾选即可, 1、Line comment at first column (行注释在第一列…...
基于大型语言模型的高效时间序列预测模型选择
时间序列预测在金融、医疗、能源等多个领域具有重要意义,其结果对于决策和规划起到关键作用。然而,选择合适的预测模型往往需要丰富的领域知识和大量计算资源。Abdallah等(2022)的研究表明,没有单一算法能在所有预测任…...
2025 EAU UTUC指南学习笔记③:诊断策略精读——从症状到活检,如何科学判断治疗路径?
👋 欢迎关注我的学习专栏~ 如果觉得文章有帮助,别忘了点赞、关注、评论,一起学习 本文聚焦UTUC的诊断策略,全面梳理影像学检查、尿液学检测、内镜评估与活检手段,并结合指南推荐等级,提出科研视角的思考。 …...
【Ubuntu】Netplan静态网络配置
1.配置文件 # 默认配置文件:/etc/netplan/*.yaml# 本机 rootubuntu-server:~# vim /etc/netplan/50-cloud-init.yaml 2.DHCP network: ethernets:ens33:dhcp4: trueversion: 2 3.静态IP设置 注意:netplan 说明文件格式存储在下列路径下…...
【SQLSERVER】Ubuntu 连接远程 SQL Server(MSSQL)
Ubuntu 连接远程 SQL Server(MSSQL) 引言 在企业级开发环境中,跨平台的数据库连接是常见需求。虽然 SQL Server 通常在 Windows 服务器上运行,但在 Ubuntu 上连接远程 SQL Server 也非常重要。本文将详细介绍如何在 Ubuntu 上通…...
GuPPy-v1.2.0安装与使用-生信工具52
GuPPy:Python中用于光纤光度数据分析的免费开源工具 01 背景 Basecalling 是将原始测序信号转换为碱基序列的过程,通俗地说,就是“把碱基识别出来”。这一过程在不同代测序技术中各不相同: 一代测序是通过解析峰图实现࿱…...
Mysql-OCP PPT课程讲解并翻译
#跳过介绍,直接从干货开始记录 第一章 安装mysql...
maven 依赖冲突异常分析
异常如下 Description:An attempt was made to call a method that does not exist. The attempt was made from the following location:com.google.common.cache.CacheBuilder.initialCapacity(CacheBuilder.java:353)The following method did not exist:com.google.common…...
【软件设计师:软件工程】9.软件开发模型与方法
一、软件危机与软件工程 软件危机与软件工程是计算机科学发展中密切相关的两个概念。 1.软件危机(Software Crisis) 背景:20世纪60年代至80年代,随着计算机硬件性能提升,软件规模与复杂度剧增,传统开发方法难以应对,导致大量项目失败。 表现: 成本失控:开发周期长、…...
用uniapp在微信小程序实现画板(电子签名)功能,使用canvas实现功能
效果: 功能:实现重签 退出 保存 等功能 解决的问题: 电子签名画布抖动问题解 注意: 保存的时候上传到自己的服务器地址,后端返回图片地址 代码: <template><view><view class"signature&qu…...
旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用
在旅游设备制造行业,产品质量直接关系到用户体验与企业口碑。从景区缆车、观光车到水上娱乐设施,每一件设备的安全性与可靠性都需经过严苛检测。然而,传统质检模式常面临数据分散、流程不透明、合规风险高等痛点,难以满足旅游设备…...
为什么使用Less替代原始CSS?
What is Less? Less 是一种 CSS 预处理器,它在 CSS 的基础上添加了许多有用的特性,提供了更高效、更灵活的方式来编写样式代码。 特性: 1、变量(Variables) 优势: 可以定义一个值并在整个样…...