音频开发中常见的知识体系
在 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
)。