Linux 音频驱动之 PulseAudio 与 ASLA 浅析
PulseAudio
PulseAudio About - office website
PulseAudio is a sound server.
PulseAudio comes with many plugin modules. All audio from/to clients and audio interfaces goes through modules.
PulseAudio带有许多插件模块。所有来自/到客户端和音频接口的音频都通过模块。
PulseAudio clients can send audio to "sinks" and receive audio from "sources". A client can be GStreamer, xinelib, MPlayer or any other audio application. Only the device drivers/audio interfaces can be either sources or sinks (they are often hardware in- and out-puts).
PulseAudio 客户端可以将音频发送到“接收器(sinks)”并从“源(sources)”接收音频。
客户端可以是GStreamer,xinelib,MPlayer或任何其他音频应用程序。只有设备驱动程序/音频接口可以是源或接收器(它们通常是硬件输入和输出)。
PulseAudio - Software architecture - Wikipedia
In broad terms ALSA is a kernel subsystem that provides the sound hardware driver, and PulseAudio is the interface engine between applications and ALSA. However, its use is not mandatory and audio can still be played and mixed together without PulseAudio.
从广义上讲,ALSA是提供声音硬件驱动程序的内核子系统,PulseAudio是应用程序和ALSA之间的接口引擎。但是,它的使用不是强制性的,音频仍然可以在没有 PulseAudio 的情况下播放和混合在一起。
One of the goals of PulseAudio is to reroute all sound streams through it, including those from processes that attempt to directly access the hardware (like legacy OSS applications). PulseAudio achieves this by providing adapters to applications using other audio systems, like aRts and ESD.
PulseAudio 的目标之一是重新路由通过它的所有声音流,包括来自尝试直接访问硬件的进程(如旧版 OSS 应用程序)的声音流。PulseAudio 通过为使用其他音频系统(如 aRTS 和 ESD)的应用程序提供适配器来实现这一点。
In a typical installation scenario under Linux, the user configures ALSA to use a virtual device provided by PulseAudio. Thus, applications using ALSA will output sound to PulseAudio, which then uses ALSA itself to access the real sound card. PulseAudio also provides its own native interface to applications that want to support PulseAudio directly, as well as a legacy interface for ESD applications, making it suitable as a drop-in replacement for ESD.
在Linux下的典型安装方案中,用户将ALSA配置为使用PulseAudio提供的虚拟设备。因此,使用 ALSA 的应用程序会将声音输出到 PulseAudio,然后 PulseAudio 使用 ALSA 本身访问真正的声卡。PulseAudio 还为希望直接支持 PulseAudio 的应用程序提供自己的本机接口,以及用于 ESD 应用的传统接口,使其适合作为 ESD 的直接替代品。
PulseAudio 相关工具
常用的 PulseAudio 工具的介绍:
1. pactl
pactl 是 PulseAudio 的命令行控制工具,用于管理和查询 PulseAudio 服务器的状态和设置。它可以用于控制音量、调整音频设备的属性、管理输入/输出流等。
2. pacmd
pacmd 是 PulseAudio 的 高级
命令行控制工具,提供了更丰富的功能和选项
,用于管理 PulseAudio 服务器。它可以用于设置音频设备的参数、创建和管理音频流、配置音频效果等。不加参数可以直接进入 CLI 交互模式。
2.1 pacmd 命令案例
- 设置音频输入/输出设备的参数:
- 设置采样率:
pacmd set-default-sample-rate <采样率>
- 设置通道数:
pacmd set-default-channel-map <通道映射>
- 设置采样率:
- 动态加载和卸载音频模块:
- 加载模块:
pacmd load-module <模块名称> <参数>
- 卸载模块:
pacmd unload-module <模块编号>
- 加载模块:
- 查询和管理音频设备的状态:
- 查询音频设备状态:
pacmd list-sinks
- 查询音频流状态:
pacmd list-sink-inputs
- 查询音频设备状态:
3. pavucontrol
pavucontrol 是 PulseAudio 的 GUI 程序,用于管理和调整音频设置。
3. paplay
paplay 是一个简单的命令行工具,用于播放音频文件。可以使用paplay
命令来播放本地音频文件或从网络流媒体中捕获的音频。
4. parec
parec 是一个命令行工具,用于录制音频。它可以从指定的音频设备或流中捕获音频,并将其保存为文件或通过管道传输到其他应用程序。
Module
pactl list module
pactl list module
命令用于列出当前系统上加载的 PulseAudio 模块的详细信息以及它们的配置和状态,不同的模块来提供不同的功能和特性。
PulseAudio 问题分析
1. pavucontrol 中的 palyback 和 output device 是一个意思吗?
在 pavucontrol
中,"Playback" 和 "Output Device" 是两个不同的概念,它们并不完全相同。
-
Playback (播放):
在 "Playback" 选项卡中,设置的是正在播放音频的应用程序和它们的音频流。可以调整每个应用程序的音量和其他播放设置,这些设置会影响到音频的输出。 -
Output Device (输出设备):
在 "Output Devices" 选项卡中,可以选择用于音频输出的设备。这些设备可以是扬声器、耳机、外部音频接口等。可以切换输出设备,调整设备的音量和其他设置。
虽然 "Playback" 和 "Output Device" 都与音频的播放和输出有关,但它们涉及到不同的方面。"Playback" 是针对每个应用程序的音频流进行调整,而 "Output Device" 是确定音频输出使用的设备。
2. pacmd vs pactl
pactl
更适合进行常见和简单的音频设备管理任务,而 pacmd
则更适合进行更高级的音频配置和控制。
两者一些区别:
- 使用方式:
pactl
更易于使用和记忆,它提供了一些常用操作的简单命令别名。例如,pactl set-sink-volume
可以用来设置音频输出设备的音量。pactl
命令具有更高级的抽象层,适合于快速进行一些基本操作。 - 功能丰富性:
pacmd
提供了更多的详细控制和配置选项。它允许以更底层的方式与音频服务器进行交互,并提供了更多高级功能和选项。使用pacmd
命令,可以执行更复杂的操作,如创建和管理音频流、配置音频输入/输出、设置音频格式等。
list 方式
pactl list sinks
pacmd list-sinks
两条命令作用相同,都用于列出系统中的音频输出设备(sink)。
这两个命令的输出内容和格式可能会有一些差异,但都提供了关于音频输出设备的详细信息,例如设备名称、驱动程序、音量级别、通道配置等。
3. 查看 PulseAudio 所使用的后端 (此条不确定)
[root@localhost ~]# pactl info
服务器字串:/run/user/0/pulse/native
程序库协议版本:33
服务器协议版本:33
是否本地服务器:是
客户端索引:148
区块大小: 65472
用户名:root
主机名:localhost.localdomain
服务器名:pulseaudio
服务器版本:13.99.1-rebootstrapped
默认采样规格:s16le 2ch 44100Hz
默认声道映射:front-left,front-right
默认音频入口:alsa_output.platform-PHYT0006_00.stereo-fallback
默认信源: alsa_input.platform-PHYT0006_00.multichannel-input
Cookie:e3cd:f4fe
从最后两行可以看出 PulseAudio 的后端是 ALSA(Advanced Linux Sound Architecture)。这些行指示了默认音频输出设备和输入设备的名称,都以 "alsa_" 开头,表明 PulseAudio 正在使用 ALSA 后端进行音频输入和输出。
module 就是 PulseAudio 所使用的后端吗?
不,PulseAudio 的模块(modules)和后端(backend)是不同的概念。
模块(modules) 在 PulseAudio 中,模块是负责实现特定功能的插件。它们允许对音频流进行处理、应用音频效果、配置输入/输出设备等。模块可以通过加载和卸载来动态扩展和修改 PulseAudio 的功能。每个模块都有一个特定的功能领域,并可以通过配置文件进行参数设置。例如,module-alsa-sink
是一个用于将音频数据传输到 ALSA(Advanced Linux Sound Architecture)的模块,module-echo-cancel
是用于降噪和消除回声的模块。
后端(backend) 后端是 PulseAudio 用于与底层音频系统进行通信的组件。它负责将音频数据从应用程序发送到硬件设备,并处理音频输入来供应用程序使用。PulseAudio 支持多种后端,如 ALSA、OSS(Open Sound System)、JACK(JACK Audio Connection Kit)等。每个后端都有自己的特定配置和设置,以实现与底层音频系统的交互。不同的后端适用于不同的硬件或软件环境,它们提供了与特定硬件或软件兼容的音频驱动程序。
因此,模块和后端在 PulseAudio 中扮演不同的角色。模块用于提供特定的音频功能,而后端用于与硬件或其他音频系统进行通信。
ALSA
ALSA 相关工具
在 ALSA(高级 Linux 声音架构)中,有几个相关的命令和概念,它们是 alsamixer
、amixer
、alsactl
、aplay
和 arecord
。alsamixer
和 amixer
用于调整和管理音频设备的参数、音量和状态。aplay
用于播放音频文件,而 arecord
用于录制音频数据。.下面是对每个命令和它们的作用的详细介绍:
1. alsamixer
alsamixer 是一个命令行界面的音频控制工具。它可以用来调整音频设备的音量、平衡、静音状态等参数。alsamixer
提供了一个交互式界面,可以通过键盘上的方向键和调节键来控制音频设置。可以使用alsamixer
来调整音量、平衡和其他音频设置,以及查看当前音频设备的状态。
- q,w,e 用于增加音量,分别表示为 left, both, right;
- z,x,c 用于减少音量,分别表示为 left,both, right;
- F6 选择不同的声卡。
MM
表示静音,00
表示非静音,通过按键M
进行切换。- 通过左右方向键切换不同的参数配置。通过上下方向键调节音量值。
- 按
ESC
键保存并退出。
2. amixer
amixer 是一个命令行
工具,用于控制和管理音频设备的各种参数。与alsamixer
不同,amixer
不提供交互式界面,而是通过命令行参数
来操作音频设备。可以使用amixer
来查询和设置音量、静音状态等。
使用案例:
- 使用 amixer 调节输出设备的左右声道音量,使用百分比:
[skyzcyou@localhost ~]$ amixer sset Master 80%,50% Simple mixer control 'Master',0 Capabilities: pvolume pswitch pswitch-joined Playback channels: Front Left - Front Right Limits: Playback 0 - 65536 Mono: Front Left: Playback 52429 [80%] [on] Front Right: Playback 32768 [50%] [on]
3. alsactl
alsactl 是一个用于管理 ALSA 配置和状态的命令行工具。它可以用于保存和恢复音频设备的状态,以及加载和卸载 ALSA 配置文件。使用alsactl store
命令可以将当前的音频设备状态保存到配置文件中,而alsactl restore
命令则可以加载之前保存的音频设备状态。
当使用alsactl
命令时,有几个常用的子命令可供选择,包括store
、restore
、init
和kill
。下面是每个子命令的详细使用方法和案例:
3.1 alsactl store
alsactl store 命令用于将当前音频设备的状态保存到配置文件中。
这样,在系统重新启动后,可以使用alsactl restore
命令加载之前保存的音频设备状态。
示例用法:
alsactl store <配置文件路径>
示例案例:
alsactl store /etc/asound.state
这将将当前的音频设备状态保存到/etc/asound.state
配置文件中。
实际上执行这句会提示,表示 该配置文件已经存在与 /etc/asound.state
:
[skyzcyou@localhost ~]$ alsactl store /etc/asound.state
alsactl: state_lock:125: file /var/lib/alsa/asound.state lock error: File exists
3.2 alsactl restore
alsactl restore
命令用于加载之前保存的音频设备状态,将其应用到当前的音频设备。
示例用法:
alsactl restore <配置文件路径>
3.3 alsactl init
alsactl init 命令用于初始化音频设备的状态,并将其设置为默认值。
示例用法:
alsactl init
这将初始化音频设备的状态,并将其设置为默认值。
3.4 alsactl kill
alsactl kill 命令用于停止alsactl
守护进程。守护进程负责在系统启动时加载之前保存的音频设备状态。
示例用法:
alsactl kill
这将停止alsactl
守护进程。
4. aplay
aplay 是一个命令行音频播放工具,用于播放音频文件。从文件或标准输入中读取音频数据,并将其发送到音频设备进行播放。
4.1 aplay -l
aplay -l
命令用于列出系统中可用的音频设备(包括音频输入和输出设备)。这个命令会显示音频设备的详细信息,例如设备编号、设备名称、支持的采样格式、通道数等。
具体来说,aplay -l
的输出会包含以下信息:
- 卡号(Card number):表示音频设备所在的卡的编号。一台计算机可能有多个音频卡,每个卡都有一个唯一的编号。
- 设备号(Device number):表示音频设备在所在卡上的编号。一个音频卡可能有多个设备,每个设备都有一个唯一的编号。
- 子设备号(Subdevice number):如果音频设备支持多个子设备,那么每个子设备都有一个唯一的编号。
- 设备名称(Device name):表示音频设备的名称,用于在配置文件或命令中引用设备。
- 子设备名称(Subdevice name):如果音频设备支持多个子设备,那么每个子设备都有一个唯一的名称。
通过运行 aplay -l
命令,您可以获取有关系统中音频设备的详细信息,这对于配置和调试音频设备非常有用。
[root@localhost video]# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: fthda [ft-hda], device 0: CX20632 Analog [CX20632 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
5. arecord
arecord
是一个命令行录音工具,它可以录制音频数据。
5.1 arecord -l
通过arecord -l 命令查看系统的麦克风/音频输入设备 (扬声器不会出现)。
[skyzcyou@dev2-344-youzhe Videos]$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: Intel [HDA Intel], device 0: Generic Analog [Generic Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
6. apulse
apulse
是一个兼容 PulseAudio 的 ALSA 接口。apulse
允许在使用 ALSA 的系统上运行 PulseAudio 应用程序,以便与 PulseAudio 一起使用。
7. alsaloop
alsaloop
是一个用于回放和录制音频的工具。它可以将音频数据从一个 ALSA 设备捕获并将其传输到另一个 ALSA 设备。这对于实时音频处理和混音非常有用。
8. 检索驱动程序状态
https://wiki.archlinux.org/title/Advanced_Linux_Sound_Architecture#Dmix
alsa-utils 包包含 alsa-info.sh
命令,该命令可用于收集有关 ALSA 驱动程序和用户空间状态的详细数据。
ALSA 问题分析
1. 输出系统中的音频设备
常用的命令:
0. aplay -l
: -l, --list-devices 显示系统中可用的声卡和数字音频设备的列表。这些设备包括声卡、USB 音频接口、HDMI 音频输出等。
aplay -L
:-L
或--list-pcms
选项用于列出系统中的音频设备名称。这些设备支持 PCM 编码和解码,可你以用于音频数据的输入和输出。
在音频领域中,PCM 是脉冲编码调制(Pulse Code Modulation)的缩写。PCM 是一种将模拟声音信号转换为数字音频信号的方法。PCM 是一种线性数字编码方法,它通过将模拟音频信号的振幅值在时间上进行离散化和量化,将其转换为数字表示。这种数字表示可以在计算机系统中进行处理、存储和传输。
在该命令中提到的-L
或--list-pcms
选项用于列出音频设备的名称。这些设备名称通常与系统中的 PCM 设备相关联,表示可以进行 PCM 编码和解码的音频设备。这些设备可以是声卡、数字音频接口、音频编解码器等。
总结,-L
或--list-pcms
选项用于列出系统中的音频设备名称,这些设备支持 PCM 编码和解码,可以用于音频数据的输入和输出。... default Default ALSA Output (currently PulseAudio Sound Server) ...
lsmod | grep snd
:查找与音频相关的内核模块。可用于列出已加载的 ALSA 驱动模块。cat /proc/asound/cards
:显示系统中安装的物理声卡的信息。它列出了物理声卡的编号、名称和驱动程序等信息。arecord -l
:列出系统中可用的音频输入设备(麦克风等)的信息。输出信息类似于aplay -l
命令。
归总问题
1. 视频本身的声道是否会影响播放器的输出?
不会,经过本地正常机器上进行测试,就算是单声道视频也可以手动调整来实现播放时候的左右声道大小。
Mono or monoaural sound only uses one channel when converting a signal into a sound. Even if there are multiple speakers, the same signal will go to both speakers. This then gives the effect that the sounds, even if they are coming from separate speakers, are coming from one single position or source.
Mono vs Stereo Sound: What's the Big Difference?
上面的文章指出,单声道视频或音乐在将信号转换为声音时仅使用一个通道。即使有多个扬声器,相同的信号也会发送到两个扬声器。
将信号转换为声音时通常涉及两个阶段:播放设备的处理和扬声器的输出。
在播放设备的处理阶段,音频信号通常会经过混音和处理,以便在不同的扬声器上产生所需的音效。在这个阶段,单声道音频信号可能会被复制到两个通道,以便在双声道环境中播放
。
然后,在扬声器的输出阶段,每个扬声器会接收到相同的信号,并根据其位置和配置来产生声音。在双声道环境中,左声道的信号将被发送到左边的扬声器,右声道的信号将被发送到右边的扬声器。这样可以模拟出立体声效果。
所以,当播放单声道音频或视频时,即使有多个扬声器,相同的信号也会被发送到多个扬声器。这是为了确保在双声道环境中产生音频的平衡和一致性。
可以使用 ffmpeg 查看视频本身是否是立体声:
[skyzcyou@localhost]# ffmpeg -i 视频路径
...
Metadata:
creation_time : 2023-05-17T04:49:46.000000Z
handler_name : ISO Media file produced by Google Inc. Created on: 05/16/2023.
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
若 Stream 段中为 stereo 表示视频本身为立体声,若为 mono 则表示视频本身为单声道。
2. cat /proc/asound/cards
和 aplay -l
命令区别
cat /proc/asound/cards
和 aplay -l
命令都可以用于查看声卡设备的信息,但它们之间有一些区别。
cat /proc/asound/cards
命令会直接读取 /proc/asound/cards
文件,并以原始文本的形式显示已识别的声卡设备的列表。它提供了声卡设备的索引号、名称和描述等基本信息。这个命令比较简洁,适合快速查看声卡设备的数量和基本信息。
而 aplay -l
命令则通过 ALSA 库来获取声卡设备的信息,并以更友好的格式进行显示。它会提供更详细的信息,包括声卡设备的索引号、名称、子设备号、子设备名称、子设备的硬件参数等。这个命令适合深入了解和配置声卡设备。
排查过程
通过对比另一台声道正常的飞腾机器环境,发现声卡不一致。需首先排除是否是硬件问题。
后尝试使用银河麒麟以及麒麟信安 3.5.2 进行音频测试,发现在问题机器上,上述系统声道调整功能正常,因此暂排除硬件问题。
对比发现在 问题机器(3.5.2) 中 ALSA 驱动版本高于问题机器(3.3-9):
# 问题机器(3.3-9) ALSA 驱动程序版本
[系统未激活][root@localhost ~]# cat /proc/asound/version
Advanced Linux Sound Architecture Driver
Version k4.19.90-2112.8.0.0131.kb11.ky3_4.aarch64.
# 问题机器(3.5.2) ALSA 驱动程序版本
[系统未激活][root@localhost ~]# cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version k5.10.0-153.12.0.92.kb8.ky3_5.aarch64.
ALSA 驱动程序通常作为内核模块提供,并随 Linux 内核一同发布。
通过罗清验证,将3.4-3中的内核版本升级后,该问题不再出现。
因此需考虑更新 3.4-3 版本的内核版本。
该处理未修复问题。
参考代码
了解 pulseaudio channel