音频开发中常见的知识体系
在 Linux 系统中,/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义:
一.基本术语
样本长度(sample):样本是记录音频数据最基本的单位,计算机对每个通道采样量化时数字比特位数,常见的有8位和16位。
通道数(channel):该参数为1表示单声道,2则是立体声。帧(frame):帧记录了一个声音单元,其长度为样本长度与通道数的乘积,一段音频数据就是由苦干帧组成的。
采样率(rate):每秒钟采样次数,该次数是针对帧而言,常用的采样率如8KHz的人声, 44.1KHz的mp3音乐, 96Khz的蓝光音频。
周期(period):音频设备一次处理所需要的桢数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位。
交错模式(interleaved):是一种音频数据的记录方式。在交错模式下,数据以连续桢的形式存放,即首先记录完桢1的左声道样本和右声道样本(假设为立体声格式),再开始桢2的记录。而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。不过多数情况下,我们只需要使用交错模式就可以了。
period(周期): 硬件中中断间的间隔时间。它表示输入延时。
比特率(Bits Per Second):比特率表示每秒的比特数,比特率=采样率×通道数×样本长度
二.ALSA的API构成
ALSA API可以分解成以下几个主要的接口:
控制接口:提供管理声卡注册和请求可用设备的通用功能
PCM接口:管理数字音频回放(playback)和录音(capture)的接口。本文后续总结重点放在这个接口上,因为它是开发数字音频程序最常用到的接口。
Raw MIDI接口:支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。这些API提供对声卡上MIDI总线的访问。这个原始接口基于MIDI事件工作,由程序员负责管理协议以及时间处理。
定时器(Timer)接口:为同步音频事件提供对声卡上时间处理硬件的访问。
时序器(Sequencer)接口混音器(Mixer)接口
三.by-path/
这个目录包含了音频设备的路径符号链接。它为每个音频设备创建了一个表示设备连接方式的符号链接,通常用于区分设备的物理位置,如与 USB、PCI、或者其他硬件接口的关系。
四.ALSA设备文件结构
我们从alsa在linux中的设备文件结构开始我们的alsa之旅. 看看我的电脑中的alsa驱动的设备文件结构:


controlC0, controlC1, controlC7, 等:这些文件是音频控制设备的接口。C0、C1、C7 等代表不同的声卡或音频设备编号。通过这些控制文件,你可以调整音量、选择音频源、设置静音等音频硬件的操作。
controlC0是音频设备 0 的控制接口。controlC1是音频设备 1 的控制接口。controlC7是音频设备 7 的控制接口。
-
pcmC0D0c,pcmC0D0p,pcmC1D0p, 等:这些文件是 PCM(脉冲编码调制)设备的接口,主要用于音频数据的播放和录制。pcmC0D0c和pcmC0D0p分别是音频设备 0 上的输入和输出 PCM 接口。c代表 capture(录音输入),p代表 playback(播放输出)。pcmC1D0p是音频设备 1 的播放接口,pcmC7D0p和pcmC7D1p是音频设备 7 上的播放接口。
-
timer:这个文件用于音频定时器的接口。在多媒体系统中,定时器用于同步音频播放、录制等任务。它管理音频设备的时间相关操作,确保音频数据流的正确时序。
总结来说,/dev/snd 目录下的这些文件是 Linux 系统与声音硬件交互的接口,允许你进行音频的播放、录制以及控制。你可以通过这些文件进行音量控制、选择音频输入输出设备、以及管理音频流的定时等操作。
五.音频设备信息
你可以使用 cat 或 arecord, aplay 等工具来查看音频设备的详细信息。这会列出所有音频设备的列表,包括它们的卡号、名称以及其他详细信息。
cat /proc/asound/cards

使用 aplay 查看音频输出设备:
aplay -l

通过 aplay -l 命令列出的输出显示了系统中的所有音频播放硬件设备。每个设备都被分配了一个 卡号(card) 和一个 设备号(device),以及它们的 子设备(subdevices),这些信息用于描述设备的功能和音频流的配置。
card 0: rockchiprk3308v [rockchip,rk3308-vad], device 0: dailink-multicodecs multicodec-0 [] Subdevices: 0/1 Subdevice #0: subdevice #0
- card 0:这代表第 0 张声卡,名称是
rockchiprk3308v,它是 Rockchip RK3308 的音频设备。 - device 0:这是第 0 个音频设备,名称为
dailink-multicodecs。该设备支持多种音频编解码(multicodec)。 - Subdevices: 0/1:表示该设备支持的子设备数量。在此,只有一个子设备,且它当前不可用(
0/1,表示有 1 个子设备但没有被使用)。 - Subdevice #0:这是子设备的标识符,它是播放音频流的实体。
card 1: UAC1Gadget [UAC1_Gadget], device 0: UAC1_PCM [UAC1_PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
- card 1:这是第 1 张声卡,设备名为
UAC1Gadget,它是一个 USB 音频设备,通常用于 UAC(USB Audio Class)设备。 - device 0:这是第 0 个设备,名为
UAC1_PCM,表示这是一个用于音频播放的设备。 - Subdevices: 1/1:该设备只有一个子设备,并且该子设备当前可用(
1/1)。 - Subdevice #0:这是子设备的标识符,表示该设备当前可以用来播放音频流。
card 7: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
子设备的意义
- Subdevices:每个音频设备可以有多个子设备。子设备用于处理实际的音频流。
- 在播放音频时,子设备用于标识具体的音频输出通道。
- 如果一个设备具有多个子设备,它可以同时处理多个音频流,每个子设备对应一个独立的音频输出。
- 比如,
Loopback设备通常用于将音频信号从一个设备“捕获”并“播放”到同一设备的不同子设备上。这样可以进行音频信号的循环传输。
使用 arecord 查看音频输入设备:
arecord -l

在 ALSA 中,设备标识符如
hw:0,0代表的是第一个声卡(hw:0)的第一个设备(0)。在此基础上,你还可能遇到更多类似的标识符,例如hw:0,1、hw:1,0等,这些代表了系统中的其他设备和声卡。每个设备对应系统中的一个音频接口或硬件设备。为了查找更多与hw:0,0类似的设备,你可以使用以下方法进行详细检查。
- card 0: Rockchip [Rockchip Audio] 表示声卡 0(
hw:0)是一个 Rockchip 音频设备。 - device 0 和 device 1 分别对应
hw:0,0和hw:0,1设备。 - 如果还有其他卡(如 card 1: USB [USB Audio]),则会列出类似
hw:1,0、hw:1,1等设备。

提供的 /proc/asound/devices 文件输出中,设备的编号和类型是以数字表示的。例如,0-0、1-0 等,这些并不是指 hw:0,0 或 hw:1,0 这样的传统格式,而是 ALSA 使用的设备编号系统。

- 设备编号:在设备编号中,
0、1、7等数字代表的是声卡编号,类似于hw:0、hw:1等。 - 子设备编号:设备编号后面的
-和数字(如0-0、1-0)表示子设备或设备上的接口。例如,0-0就是声卡 0 上的第一个设备(hw:0,0),1-0是声卡 1 上的第一个设备(hw:1,0)。
根据设备的编号和类型进一步确认设备。举例说明:
- [0-0]: digital audio playback:表示声卡
0上的第一个播放设备(即hw:0,0)。 - [0-0]: digital audio capture:表示声卡
0上的第一个捕获设备(即hw:0,0)。 - [1-0]: digital audio playback:表示声卡
1上的第一个播放设备(即hw:1,0)。 - [7-0]: digital audio playback:表示声卡
7上的第一个播放设备(即hw:7,0)。
相关文章:
音频开发中常见的知识体系
在 Linux 系统中,/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义: 一.基本术语 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每个通道采…...
【返璞归真】score检验:似然比的得分检验(Likelihood Ratio Score Test)
Score检验(Score Test)是一种用于假设检验的方法,特别是在统计建模中,常用于估计模型参数时检验某个假设是否成立。它的全名是“似然比的得分检验”(Likelihood Ratio Score Test),通常用于大样…...
三维重建(六)——3D Representation Methods: A Survey(北大总结三维表征--2024.10出版)
文章目录 一、摘要二、引言2.1 研究焦点和发展历程三、3D表征3.1 体素网格3.2 点云3.3 网格3.4 符号距离函数(SDF)3.5 神经辐射场(NeRF)3.6 三维高斯溅射(3D Gaussian Splatting, 3DGS)3.7 混合方法3.7.1 深度步进四面体(Deep Marching Tetrahedra, DMTet)3.7.2 三平面…...
html基础-认识html
1.什么是html html是浏览器可以识别的的标记语言,我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…...
UE5 跟踪能力的简单小怪
A、思路 1、用素材的骨骼网格体创建小怪BP,绑定新的小怪控制器。 2、控制器的事件开始时,获取玩家状态,指定AI小怪自动向玩家移动。 复杂的AI需要用强大功能如黑板、行为树。 而简单的AI则可以用简单方法实现,杀鸡不用牛刀。视…...
Ubantu22系统安装Miniconda3
1、Anaconda和Miniconda异同 清华源镜像的Miniconda3和Anaconda都是用于管理Python环境和软件包的工具,但它们之间存在一些关键的不同之处。下面将分别介绍它们的特点以及使用清华源镜像的差异。 相同点: (1)功能相似:…...
130、java中在使用new ArrayList<>(),在参数中传入一个集合的作用
在Java中,当你使用new ArrayList<>()时,你正在创建一个新的ArrayList实例。如果你在其后跟一对尖括号,并在内部传入一个集合,那么这实际上是一个"初始容量"的概念。 例如,如果你有一个集合otherList&…...
Mybatis-plus-Join--分页查询
数据表四张: user: id,username,create_time,update_time product: id,name,price,number(库存),create_time,update_times order: id,quantity,order_time(下单时间),update_time order_detail:id,product_id,order_id,quant…...
对BG兼并点的理解-不断刷新版
常想常新,每次接触都有新理解,不确定想的是否正确,拿出来讨论,以最新结论为准 2024-9-19 1、仿真简并点时需要断开启动电路:启动电路会干扰DC结果的计算,可能看到加启动电路后简并点减少,但在…...
python的游标是什么
CURSOR(私有SQL 区)就是一个句柄,即指针或引用,指向sql私有区(一个用户的能打开的cursor数由参数open_cursors决定)【确切说,指向sql私有区里的固定部分(The persistentarea…...
硬件---14---PCB学习:PCB封装库及布局操作
一PCB封装元素的组成与介绍 二实例-贴片0603封装的创建 1封装命名 找不到封装库创建页面,可以配合右下角的Panels去找。 找到0603电阻或者电容的PCB封装,根据提供尺寸去设计PCB的封装。 <1>双击PCB器件封装 <2>命名 2放置焊盘ÿ…...
什么是MyBatis
MyBatis 简介 MyBatis 是一个流行的 Java 持久层框架(Persistence Framework),它主要用于简化数据库操作,提供了对数据库的映射支持,使得开发人员能够通过简单的配置和映射文件来执行数据库操作(如增、删、…...
开发技术-Java改变图片格式
图片上传页未做控制,导致上传的是GIF格式,导致图片识别失败。需要将GIF格式转为JPEG格式。 代码,是找AI写的,记录一下: import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; im…...
基于DockerCompose搭建Redis主从哨兵模式
linux目录结构 内网配置 哨兵配置文件如下,创建3个哨兵配置文件 # sentinel26379.conf sentinel26380.conf sentinel26381.conf 内容如下 protected-mode no sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 60000 s…...
aioice里面candidate固定UDP端口测试
环境: aioice0.9.0 问题描述: aioice里面candidate固定UDP端口测试 解决方案: /miniconda3/envs/nerfstream/lib/python3.10/site-packages/aioice import hashlib import ipaddress import random from typing import Optional import…...
Git使用教程-分支使用/合并分支提交
Git使用教程-分支使用 文章目录 Git使用教程-分支使用一、分支(branch)的基本操作:二、查看分支:参考 一、分支(branch)的基本操作: git clone https://.git git status …...
单元测试使用记录
什么是单元测试 简单来说就是对一个类中的方法进行测试,对输出的结果检查判断是否符合预期结果 但是在多年的工作中,从来没有哪个项目中真正系统的用到了单元测试,因此对它还是很陌生的,也就造成更加不会在项目中区使用它。 如何…...
LabVIEW实时信号采集与频谱分析
系统通过LabVIEW与PXIe硬件结合,实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换(FFT)、功率谱图生成及动态缩放调整,同时支持信号平均与噪声抑制。系统设计灵活,适用于…...
OpenCV(python)从入门到精通——运算操作
加法减法操作 import cv2 as cv import numpy as npx np.uint8([250]) y np.uint8([10])x_1 np.uint8([10]) y_1 np.uint8([20])# 加法,相加最大只能为255 print(cv.add(x,y))# 减法,相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…...
基础2:值类型与右值引用
1.函数返回 在讲解右值之前,要知道下面这个函数要进行几次拷贝以及为什么? int get_x() {int x 20;return x; }int aget_x(); 答案:两次 # 第一次 int tmpa; # 第二次 int xtmp;2.左值与右值 🍏2.1 能取地址操作的就是左值 …...
不用npm!3分钟搞定微信小程序引入Animate.css的另类方法
微信小程序免npm引入Animate.css的极简方案 最近在开发微信小程序时,发现很多开发者都在寻找一种更简单的方法来引入Animate.css动画库,而不必依赖npm。对于不熟悉node环境的开发者来说,npm安装过程可能会遇到各种问题。今天我就分享一个完全…...
PyTorch模型的TensorRT优化:原理与实践
PyTorch模型的TensorRT优化:原理与实践 1. 背景与意义 在深度学习模型部署过程中,推理速度是一个关键指标。TensorRT是NVIDIA开发的高性能深度学习推理优化库,它可以显著提高模型的推理速度,降低延迟。本文将深入探讨TensorRT的工…...
这次咱们来拆解PFC二维浆岩直剪案例。这个案例有意思的地方在于它展示了颗粒材料与刚性墙体接触面的剪切行为,咱们边看代码边分析剪切曲线的门道
PFC案例9,浆-岩二维直剪,包含代码源文件、代码解释、曲线分析先看模型搭建的关键代码段: ;生成浆体颗粒 ball distribute ... ;创建上下剪切盒 wall generate id 1 vertices 0 0 1 0 1 1 0 1 wall generate id 2 vertices 0 0.2 1 0.2;设置…...
iStore软件中心:OpenWRT插件管理解决方案与实战指南
iStore软件中心:OpenWRT插件管理解决方案与实战指南 【免费下载链接】istore 一个 Openwrt 标准的软件中心,纯脚本实现,只依赖Openwrt标准组件。支持其它固件开发者集成到自己的固件里面。更方便入门用户搜索安装插件。The iStore is a app s…...
LangChain4j向量化实战避坑:OpenAI、本地模型、Qdrant选哪个?我的踩坑记录
LangChain4j向量化实战避坑指南:OpenAI、本地模型与Qdrant的深度抉择 当Java开发者尝试构建基于大语言模型的应用时,LangChain4j框架中的向量化组件往往成为技术栈选型的第一个分水岭。我在三个实际项目中分别尝试了不同组合方案后,发现每个…...
解决数字记忆碎片化的创新方案:GetQzonehistory让社交数据成为可触摸的时光胶囊
解决数字记忆碎片化的创新方案:GetQzonehistory让社交数据成为可触摸的时光胶囊 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 副标题:重构QQ空间回忆的3大突破…...
特斯拉行车记录仪视频合并终极指南:高效处理多摄像头记录的专业方案
特斯拉行车记录仪视频合并终极指南:高效处理多摄像头记录的专业方案 【免费下载链接】tesla_dashcam Convert Tesla dash cam movie files into one movie 项目地址: https://gitcode.com/gh_mirrors/te/tesla_dashcam 特斯拉行车记录仪视频智能合并工具tesl…...
避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧
避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧 在嵌入式开发中,ADC(模数转换器)的数据采集是一个基础但至关重要的功能。当我们需要高效、稳定地采集大量数据时,通常会使用DMA…...
构建高性能语音识别API:FastAPI与Whisper实战指南 [特殊字符]
构建高性能语音识别API:FastAPI与Whisper实战指南 🚀 【免费下载链接】awesome-fastapi A curated list of awesome things related to FastAPI 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-fastapi 在当今人工智能和语音技术飞速发展的…...
QMLWeb:让QML应用在浏览器中无缝运行的开源引擎
QMLWeb:让QML应用在浏览器中无缝运行的开源引擎 【免费下载链接】qmlweb A QML engine in a web browser. Current state: fixing things… 项目地址: https://gitcode.com/gh_mirrors/qm/qmlweb QMLWeb是一个创新的开源项目,它打破了QML只能在桌…...
