ALSA之dmix插件
一、 声卡基础
我听到声卡这个词的时候一脸懵逼,他英文名叫做Audio Interface,完成的工作为ADDA(数模/模数转换)。
拓展:耳机接口都见过吧,分3-pole 的接口和4-pole 的接口,就是接口上有几个触点。3-pole 的不支持麦克风。这种耳机输出的信号为模拟信号。所以usb转pole接口的转接线被称为声卡。
二、 音视频编码
1.1 音频基本概念
音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation,PCM)数据。有以下参数:
采样率:声音每秒的采样个数。
量化格式(format):指记录声音的动态范围,它以位(Bit)为单位。
声道(channels):声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。(单声道,双声道,四声道,5.1甚至7.1声音系统开始出现,以求让人达到完美的声音体验)。
1.2 采样率根据使用类型不同大概有以下几种(k既千位符号,1khz=1000hz)
- 8khz:电话等使用,对于记录人声已经足够使用。
- 22.05khz:广播使用频率。
- 44.1khz:音频CD。
- 48khz:DVD、数字电视中使用。
- 96khz-192khz:DVD-Audio、蓝光高清等使用。
采样精度常用范围为8bit-32bit,而CD中一般都使用16bit。
1.3 比特率:每秒传输的数据量
比特率 = 采样率 × 采样精度 × 通道数。
比如 采样率 = 44100,采样深度 = 16,通道 = 2 的音频的的比特率就是
44100 * 16 * 2 = 1411200 bps (每秒传输1411200位数据)
1.4 有损压缩与无损压缩
有损压缩后会删除内容,删除后的内容无法恢复。无损压缩即通过重新排列组合的方式达到压缩目的,压缩后内容可以恢复。
1.5 常用音频编码格式
数字音频文件是通过声音录入设备录制的原始声音,直接记录了真实声音的二进制采样数据,有些文件并对原始数据进行了频率过滤和存储格式压缩,音频文件格式主要分有损和无损两类。有损文件格式是基于声学心理学的模型,除去人类很难或根本听不到的声音。
无损格式,例如PCM,WAV,ALS,ALAC,TAK,FLAC,APE,WavPack(WV)
有损格式,例如MP3,AAC,WMA,Ogg
a) WAV
PCM(脉冲编码调制)是Pulse Code Modulation的缩写。WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。
特点:音质非常好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。
b) MP3(有损)
MP3具有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。
特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。
c) AAC(有损)
AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三种主要的编码格式。LC-AAC是比较传统的AAC,相对而言,其主要应用于中高码率场景的编码(≥80Kbit/s);HE-AAC(相当于AAC+SBR)主要应用于中低码率场景的编码(≤80Kbit/s);而新近推出的HE-AAC v2(相当于AAC+SBR+PS)主要应用于低码率场景的编码(≤48Kbit/s)。事实上大部分编码器都设置为≤48Kbit/s自动启用PS技术,而>48Kbit/s则不加PS,相当于普通的HE-AAC。
特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。
适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码。
d)还有Ogg(有损) APE(无损)FLAC(无损)等不做过多介绍
三、 ALSA相关基础
1.1 ALSA简介
ALSA是Advanced Linux Sound Architecture的简称。ALSA是为了克服OSS的一些局限性而开发的,它提供了更多高级功能,如多音频设备支持、多重采样率转换等,并逐渐取代OSS成为Linux内核中默认的音频子系统。(在ALSA成为主流之后,为了保持向后兼容性,ALSA提供了模拟OSS的兼容模式,使得原本为OSS设计的应用程序可以在ALSA上运行而无需修改。)
ALSA 是一个完全开放源码的音频驱动程序集,是由志愿者维护的开源项目,而 OSS 则是由公司提供的商业产品。ALSA 系统包括驱动包alsa-driver(集成在内核源码), 用户空间的 alsa-libs 函数库,开发包插件 alsalibplugins,设置管理工具包 alsa-utils,其他声音相关处理小程序包alsa-tools,特殊音频固件支持包 alsa-firmware,OSS 接口兼容模拟层工具 alsa-oss 共 7 个子项目,其中只有 alsa-driver 是必须的。
1.2 ALSA与其上的各个应用层的关系
各部分的介绍请看博客:https://blog.csdn.net/xiaohouye/article/details/78180164?spm=1001.2014.3001.5502。
1.3 ALSA 整体框架
ALSA在Linux系统中可以分为两部分,在kernel空间的设备驱动层,ALSA提供了alsa-driver,这是整个ALSA框架的核心部分;同时在用户空间,ALSA提供了alsa-lib,对ALSA-driver的系统调用API进行封装,应用程序只需要调用alsa-lib中的函数就可以完成对底层音频硬件的控制。
1.3.1 alsa-lib
User空间的 alsa-lib 对应用程序提供统一的 alsa-lib-API 接口,简化了应用程序的实现难度。alsa-lib 主要以 plugin 插件的形式体现。详细信息详见http://www.alsa-project.org/alsa-doc/alsa-lib/ 。
1.3.2 ALSA-driver
Linux 内核空间中,ALSA-driver 其大致可分为三层:声卡对象描述层、ALSA 核心层 ASLA Core 和 Audio 设备驱动层 Audio device driver(参考博客:https://blog.csdn.net/xiaohouye/article/details/78189740?spm=1001.2014.3001.5502)。