pcm
在学习audio的过程中,经常会遇到PCM这个设备,那什么是PCM?跟随下面的这个链接: https://blog.csdn.net/cc289123557/article/details/78745277 来看一下这个特有名词.
脉冲编码调制(Pulse Code Modulation,PCM),就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输,这是基本原理。 根据此原理,在音频领域的数字音频就用pcm设备来代表,pcm也是一种音频格式,可以自定义通道数,采样率,采样精度;我们经常采用的I2S格式其实属于pcm的一种,不过I2S规定了只有2通道。 音频的采样率(rate)一般采用44.1K,16K,48K等,采样精度(format)一般都是8/16/24/32bit
kernel结构体设备:
一个音频设备分播放和录音两个功能,对应到pcm就分PLAYBACK和CAPTURE,分别用结构体snd_pcm_str来表示,一个播放或者录音设备可以集成多个音频流,每个音频流用snd_pcm_substream结构体来表示 好,引用到此结束。
今天我们不聊kernel,只关注上层的应用。在ALSA(Advanced Linux Sound Architecture)中, pcm代表了一个通路。
总结来说就是, pcm设备就是kernel的抽象层,可以把计算机硬件声卡采集到的物理特性进行描述,正如上面的通道数、采样率、采样精度等。
User space
这块属于ALSA-lib的东西了。包含一套插件机制,可以对audio进行 resampling、mixing、channel mapping等操作,
Pulseaudio
Pulseaudio作为sound server负责集成处理各种声卡的输入输出信号。目前各大linux发行版默认安装PulseAudio了。
Usage
在命令行中录音和播放
arecord
aplay
usage 1:
这个命令可以把名为cut.wav的音乐文件使用aplay播放出来。”-c 2”是2通道, -t指明类型,但是在我这里改变通道的效果没有体现出来。
这两个工具在使用的过程中遇到的一个问题是,”-L”参数只会列出该pc中的芯片设备,当你插入一个mic,并不会自己分辨出 哪个是刚才插入的mic.
通过man函数可知,这里面包含有soundcards和 digital sound devices 参考: https://sysplay.in/blog/tag/arecord/
其实这里有一个问题就是,“-L”参数并不会出现类似上面URL的资料,只有一个-l
才可以。
这里有一个问题值得注意,这里的loopback有很好玩的东西在里面。在一个终端上:
然后新开一个终端,这两个shell terminator谁前谁后无所谓的。
这个时候, 在第一个终端里的recorded.wav就保存了第二个终端里的 cut.wav 的audio。
尤其注意这里的 -D
参数, hw:card-id,devices-id,subdevices-id
.总结出来的一个规律就是 playback 和 capture 得是同一个 card-id, 不同的devices-id, 相同的 subdeviced-id ,其中, subdevices-id 从0到7.
代码中录音和播放
类似这样:
参考: https://zhuanlan.zhihu.com/p/58834651
linux下物理扬声器/话筒的辨认
为什么这么说呢?主要是因为自己在pc上(尤其是内置网卡的这种),经常会遇到插上耳机无法读取输入声音的情况,也不知道为什么?
这里做一个比较好的澄清:
输出设备,也就是所谓的喇叭,如果内置了扬声器,在我使用Ubuntu观察到的情况是,插上耳机后,系统默认使用一个模拟耳机/内置音频
的输出项。如果我把耳机拔出来,则系统就会把刚才那个名称变化为扬声器/内置音频
。
总结: 如果不插入耳机,则是使用内置的扬声器,如果通过mic口插入耳机,则会是模拟耳机。
同样的情况出现在 话筒。我们现在的情况很特殊,没有内置话筒,插上带有讲话功能的耳机后出现 话筒 内置音频的变化。
pacmd
这也是一个很实用的命令,可以让你对整体的输入输出设备有一个清晰的理解。
可以看到,模拟耳机现在是可以使用的。active port
这也是一个最明显的提示。
arecord 重要进展
目前,经过n多次的实验,终于可以将mic(耳机的声音传进来了), 也就是可以使用arecord命令行进行录音了。还是老问题,首先在 Ubuntu 的声音设置中,在 input 中选择正确的物理设备。我这里是插上耳机机会显示:
话筒/内置音频
然后使用命令:
这个时候就会录制一段时间为10s, 2通道(Stereo) 采样率为48Khz, format为S16_LE的名为 my.wav的录音,然后你就可以使用 aplay 取播放它了。
当然,是从默认mic啦(如果插入耳机的话就是耳机了)
现在还有一个问题就是没法指定设备取录音,假设加上 hw:0,0 则不会录制声音。