音频开发中常见的知识体系
在 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 能取地址操作的就是左值 …...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...