跨平台音频可视化器
作者:卡尔·斯塔夫斯特兰德
演示视频
它是什么
安装中
从源头
包管理器
捕获音频
脉冲音频
管线
阿尔萨斯
MPD
斯迪奥
开放源码软件
杰克
挤压石
macOS
视窗
通过 ssh 运行
故障排除
用法
控制
配置
在其他应用程序中使用 cava
卡瓦科雷
原始输出
贡献
Cava 是一款适用于终端或桌面 (SDL) 的条形频谱音频可视化工具。
适用于:
Linux
自由BSD
macOS
视窗
该程序不适用于科学用途。当用于可视化音乐时,它的设计看起来反应灵敏且美观。
所需组件:
FFTW
库工具
汽车制造商
autoconf-archive(设置 OpenGL 所需)
软件包配置文件
构建要点
初始解析器
推荐组件:
这些音频框架之一的开发库,具体取决于您的发行版:
阿尔萨斯
脉冲音频
管线
波塔迪奥
斯迪奥
杰克
可选组件:
SDL2 开发文件
ncursesw 开发文件(捆绑在 arch 中的 ncurses 中)
CAVA 编译实际上只需要 FFTW、iniparser 和构建工具,但这只会让您能够读取 fifo 文件。要直接从系统 pipeline、pulseaudio、alsa、sndio、jack 或 portaudio 开发文件捕获音频(取决于您使用的音频系统)。
如果您对默认输出方法有问题,可以使用 Ncurses 作为替代输出方法。但这不是必需的。
所有要求都可以轻松安装在所有主要发行版中:
自由BSD
pkg install autoconf autoconf-archive automake fftw3 iniparser jackit libglvnd libtool pkgconf psftools sdl2 sndio
此外,在构建之前在 FreeBSD 上运行这些命令:
export CFLAGS="-I/usr/local/include" export LDFLAGS="-L/usr/local/lib"
Debian/Ubuntu:
sudo apt install build-essential libfftw3-dev libasound2-dev libpulse-dev libtool automake autoconf-archive libiniparser-dev libsdl2-2.0-0 libsdl2-dev libpipewire-0.3-dev libjack-jackd2-dev pkgconf
ArchLinux:
pacman -S base-devel fftw alsa-lib iniparser pulseaudio autoconf-archive pkgconf
开放SUSE:
zypper install alsa-devel fftw3-devel libpulse-devel libtool autoconf-archive pkgconf
软呢帽:
dnf install alsa-lib-devel fftw3-devel pulseaudio-libs-devel libtool autoconf-archive iniparser-devel pkgconf
苹果系统:
如果您还没有安装自制软件,请先安装:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安装先决条件:
brew install fftw libtool automake autoconf-archive pkgconf portaudio iniparser
Intel Mac 和 Apple Silicon Mac 之间的 Homebrew 软件包的安装位置不同。因此,命令会略有不同。您可以在这里找到您的类型
对于两台机器,运行以下命令来修复 macOS 找不到 libtool 的问题:
export LIBTOOL=`which glibtool` export LIBTOOLIZE=`which glibtoolize` ln -s `which glibtoolize` /usr/local/bin/libtoolize
请注意,根据版本的不同,文件名可能会略有不同,但目录应该相同。
此外,在 Apple Silicon Mac 上运行这些命令,以便 ./configure 可以找到 Homebrew 软件包:
export LDFLAGS="-L/opt/homebrew/lib" export CPPFLAGS="-I/opt/homebrew/include"
英特尔 Mac 指令在 macOS Big Sur 上进行了测试。
Apple Silicon 指令在 macOS Ventura 上进行了测试。
视窗:
请参阅cava_win
文件夹中单独的自述文件。
首先克隆这个 repo 并 cd 到它,然后运行:
./autogen.sh ./configure make
如果您安装了推荐的组件,但不想使用它(也许在一台机器上构建二进制文件以便在另一台机器上使用),则可以在配置过程中禁用相应的功能(有关详细信息,请参阅configure --help)。
对于 Windows, cava_win
文件夹中有一个 VS 解决方案文件。
将cava
安装到默认的/usr/local
:
make install
或者您可以更改PREFIX
,例如:
./configure --prefix=前缀
make uninstall
所有发行版特定的安装源可能已过时。请在此处报告任何问题之前检查版本。
pkg install cava
Tumbleweed 用户的仓库中有 cava。他们可以只使用:
zypper in cava
Leap用户需要首先添加media:apps存储库:
zypper ar -f obs://multimedia:apps/openSUSE_Leap_42.2 multimedia
如果您使用其他版本,只需将openSUSE_Leap_42.2替换为openSUSE_13.2 ,然后将其调整为您的版本。
Cava 在 Fedora 26 及更高版本中可用。 您可以通过运行以下命令来安装 Cava:
dnf install cava
卡瓦酒 (Cava) 位于 AUR。
pacaur -S cava
sudo apt install cava
Harshal Sheth 已将 CAVA 添加到他的 PPA 中,可以通过以下方式安装:
add-apt-repository ppa:hsheth2/ppa apt update apt install cava
卡瓦酒是自制的。
brew install cava
只需确保您已经安装了pulseaudio开发文件,并且cava已经构建了pulseaudio支持(如果找到开发文件,它应该是自动的)。
如果你幸运的话,你所要做的就是运行卡瓦酒。
如果没有任何反应,您可能必须使用默认来源以外的来源。默认值也可能是您的麦克风。查看配置文件以获取帮助。
放
method = pipewire
默认源是auto
,很可能是您当前选择的输出。如果您运行wireplumber,则可以使用wpctl
获取所需设备的object.path
或object.serial
进行可视化。
例如
source = alsa:pcm:3:front:3:playback
放
method = alsa
在配置文件中。
ALSA 可能很困难,因为没有本地方法可以从输出中获取音频。如果您想直接从输出(不仅仅是麦克风或线路输入)捕获音频,则必须创建 ALSA 环回接口,然后将音频同时输出到环回和普通接口。
要创建环回接口,只需运行:
sudo modprobe snd_aloop
希望您的aplay -l
现在应该包含一个环回接口。
为了使其在启动过程中保持不变,请将snd-aloop
行添加到“/etc/modules”中。为了防止它作为第一个声卡加载,请将行options snd-aloop index=1
添加到“/etc/modprobe.d/alsa-base.conf”,这会将其加载到“1”。您可以将“1”替换为音频设置中最有意义的内容。
通过 Loopback 接口播放音频可以让 cava 捕获它,但扬声器中不会有声音。为了在环回接口和实际接口上播放音频,您必须使用 ALSA 多通道。
查看包含的示例文件example_files/etc/asound.conf
了解如何使用多通道。我可以使用 HDA Intel PCH 声卡来完成这项工作,但使用 USB DAC 则不然。
请在此处阅读有关 ALSA 方法的更多信息。
如果您在 Rasberry PI 上使用 alsa 方法时遇到问题,请尝试通过将以下行添加到/boot/config.txt
并重新启动来启用mmap
:
dtoverlay=i2s-mmap
@reluekiss,能够使 cava 与 dmix 一起工作。查看example_files/etc/asound_dmix.conf
中的示例配置和问题 534。
在 mpd 中添加这些行:
audio_output { type "fifo" name "my_fifo" path "/tmp/mpd.fifo" format "44100:16:2" }
在配置文件中取消注释并将输入法更改为fifo
。
fifo的路径可以用source
参数指定。
我在同步方面遇到了一些问题(可视化工具领先于声音)。减少 mpd 中的 ALSA 缓冲区修复了这个问题:
audio_output { type "alsa" name "My ALSA" buffer_time "50000" # (50ms); default is 500000 microseconds (0.5s) }
放
method = sndio
Sndio 是 OpenBSD 上使用的音频框架,但它也可以在 FreeBSD、NetBSD 和 Linux 上使用。到目前为止,这仅在 FreeBSD 上进行了测试,但在其他操作系统上可能非常相似。以下示例演示了如何在 FreeBSD 上为 sndio 设置 CAVA(请参阅 OSS 部分,以更深入地解释本示例中的各种pcmX
声音设备和相应的/dev/dspX
音频设备)。
$ 猫 /dev/sndstat 已安装设备: pcm0:<Realtek ALC1220(后置模拟)>(播放/录制)默认值 pcm1:<Realtek ALC1220(前置模拟麦克风)>(录音) pcm2:<USB 音频>(播放/录音) 没有从用户空间安装任何设备。
Sndio 对设备描述符进行操作。一般来说,每个/dev/dspX
音频设备都有一个相应的rsnd/X
sndio 原始设备描述符。在这个例子中,有rsnd/0
、 rsnd/1
和rsnd/2
(它们没有在/dev
中列出,sndio 使用这些描述符在内部访问相应的音频设备)。 Sndio 还处理隐式default
设备描述符,它的作用类似于与默认音频设备/dev/dsp
对应的原始设备描述符的符号链接。在此示例中,它的作用类似于rsnd/0
的符号链接,因为默认音频设备/dev/dsp
符号链接到/dev/dsp0
。 Sndio 还评估环境变量AUDIODEVICE
和AUDIORECDEVICE
。如果设置了其中之一(如果两者都设置了,则AUDIORECDEVICE
将覆盖AUDIODEVICE
)并且 sndio 感知程序尝试打开default
设备描述符或未指定的设备描述符,则该程序将使用环境变量中指定的设备描述符。
现在为了在 CAVA 中可视化麦克风输入,配置文件中的source
值必须设置为相应的音频描述符:
source = default # default; symlink to rsnd/0 in this example; AUDIORECDEVICE and AUDIODEVICE evaluation source = # unspecified device descriptor; same as default above source = rsnd/0 # for the pcm0 mic on the rear source = rsnd/1 # for the pcm1 mic on the front source = rsnd/2 # for the pcm2 mic on the USB headset
使用source = default
可以在命令行上切换可视化,而无需再次更改配置文件:
$ 音频设备=rsnd/0 cava $ 音频设备=rsnd/1 cava $ 音频设备=rsnd/2 cava
Sndio 无法仅使用原始设备描述符记录播放的音频,即通过rsnd/0
在外部立体声扬声器上播放的音乐播放器或浏览器发出的声音不会在 CAVA 中可视化。为此,必须启动 sndio 服务器并创建监控子设备。以下示例显示如何启动服务器并从rsnd/0
创建监控子设备snd/0
,然后启动 CAVA,并将AUDIODEVICE
指向新的监控子设备:
$ sndiod -f rsnd/0 -m 播放,mon $ 音频设备=snd/0 卡瓦
在扬声器和 USB 耳机之间切换:
$ sndiod -f rsnd/2 -m 播放,mon -s usb -f rsnd/0 -m 播放,mon -s 扬声器 $ AUDIODEVICE=snd/usb cava $ AUDIODEVICE=snd/扬声器卡瓦
有关 sndio 服务器配置和启动的更多信息,请参阅联机帮助页sndiod(8)
。
放
method = oss
FreeBSD 上使用的音频系统是开放声音系统 (OSS)。以下示例演示了如何在 FreeBSD 上为 OSS 设置 CAVA:
$ 猫 /dev/sndstat 已安装设备: pcm0:<Realtek ALC1220(后置模拟)>(播放/录制)默认值 pcm1:<Realtek ALC1220(前置模拟麦克风)>(录音) pcm2:<USB 音频>(播放/录音) 没有从用户空间安装任何设备。
该系统有 3 个pcm
声音设备: pcm0
、 pcm1
和pcm2
。 pcm0
对应背面的模拟输出插孔,可插入外部立体声扬声器,以及模拟输入插孔,可插入麦克风。因为它封装了输出和输入,所以它被标记为play/rec
。它还被设置为default
声音设备。 pcm1
对应于前端麦克风的另一个模拟输入插孔,并标记为rec
。将带有集成麦克风的 USB 耳机插入 USB 端口,系统为其创建了具有play/rec
功能的pcm2
声音设备。
一般来说,每个pcmX
设备都有一个相应的/dev/dspX
音频设备。在此示例中,有/dev/dsp0
、 /dev/dsp1
和/dev/dsp2
(系统在需要时创建它们,如果当前未使用它们,则不会通过ls /dev
列出它们)。系统还创建一个隐式/dev/dsp
,其作用类似于default
音频设备的符号链接,在本例中为/dev/dsp0
。
现在为了在 CAVA 中可视化麦克风输入,配置文件中的source
值必须设置为相应的音频设备:
source = /dev/dsp # default; symlink to /dev/dsp0 in this example source = /dev/dsp0 # for the pcm0 mic on the rear source = /dev/dsp1 # for the pcm1 mic on the front source = /dev/dsp2 # for the pcm2 mic on the USB headset
OSS 无法自行录制输出音频,即通过/dev/dsp0
在外部立体声扬声器上播放的音乐播放器或浏览器发出的声音不会在 CAVA 中可视化。一个解决方案是使用虚拟OSS。它可以从现有的音频设备创建虚拟音频设备,特别是它可以从/dev/dsp0
创建一个环回音频设备,并且可以将播放的音频输入 CAVA:
$ doas pkg 安装 virtual_oss $ doas virtual_oss -r44100 -b16 -c2 -s4ms -O /dev/dsp0 -R /dev/null -T /dev/sndstat -l dsp.cava $ 猫 /dev/sndstat 已安装设备: pcm0:<Realtek ALC1220(后置模拟)>(播放/录制)默认值 pcm1:<Realtek ALC1220(前置模拟麦克风)>(录音) pcm2:<USB 音频>(播放/录音) 从用户空间安装的设备: dsp.cava:<虚拟 OSS>(播放/录制)
它从/dev/dsp0
创建了一个虚拟环回设备/dev/dsp.cava
。现在,音频在配置文件中使用source = /dev/dsp.cava
在 CAVA 中可视化。播放程序必须具有使用/dev/dsp.cava
设备的配置。对于无法执行此操作的程序(例如始终使用/dev/dsp
程序),请将-l dsp.cava
替换为-l dsp
。虚拟 OSS 可以作为 FreeBSD 上的服务进行配置和启动。
放
method = jack
JACK 音频连接套件 (JACK) 是一个专业的声音服务器 API,可在多种操作系统上使用,例如 FreeBSD 和 Linux。
CAVA 是一个 JACK 客户端,其基本客户端名称为cava
,并遵循标准服务器启动和停止行为,即,如果尚未运行 JACK 服务器并且定义了环境变量JACK_START_SERVER
,则 CAVA 会启动 JACK 服务器,在这种情况下,当所有服务器都停止时,服务器也会停止客户已经退出。 CAVA 配置文件中的source
指定 CAVA 尝试连接的 JACK 服务器的名称。默认值为default
,这也是默认的 JACK 服务器名称。该值可以为空,在这种情况下它意味着default
。因此以下三个条目是等效的:
; source = default source = default source =
一个例外是空source
条目和环境变量JACK_DEFAULT_SERVER
的组合。如果定义了环境变量,例如export JACK_DEFAULT_SERVER=foo
,则以下条目等效:
source = foo source =
有关 JACK 服务器配置和启动的更多信息,请参阅联机帮助页jackd(1)
。
CAVA 创建终端音频类型(因此不支持 MIDI)输入端口。这些端口可以连接到其他JACK客户端的输出端口,例如连接到音乐播放器的输出端口,CAVA将可视化音乐。目前CAVA最多支持两个输入端口,即支持单声道和立体声。输入端口的数量可以通过配置文件输入部分中的channels
选项进行控制:
channels = 1 # one input port, mono channels = 2 # two input ports, stereo (default)
该端口的简称为M
(表示单声道), L
和R
(表示立体声)。根据基本客户端名称,输入端口的全名是cava:M
(单声道)、 cava:L
和cava:R
(立体声)。
autoconnect
选项控制CAVA端口到其他客户端端口的连接策略:
autoconnect = 0 # don't connect to other ports automatically autoconnect = 1 # only connect to other ports during startup autoconnect = 2 # reconnect to new ports regularly (default)
自动连接策略扫描物理终端输入端口,即实际输出声音的真实音频设备,并将相同的连接应用于CAVA的端口。通过这种方式,CAVA 默认情况下可以可视化来自 JACK 客户端的播放音频。
为了控制和管理CAVA的端口与其他客户端程序的端口之间的连接,有JACK的连接管理程序。一些著名的具有图形用户界面的连接管理器是 QjackCtl 和 Cadence。 JACK 包本身通常附带 CLI 工具。根据操作系统的不同,可能需要单独安装它们,例如在 FreeBSD 上:
$ doas pkg 安装 jack-example-tools
这些工具包括程序jack_lsp
和jack_connect
。这两个工具足以在命令行上列出和连接端口。以下示例演示了如何使用这些工具设置连接:
$ 杰克_lsp 系统:capture_1 系统:capture_2 系统:playback_1 系统:playback_2 卡瓦酒:L 元数据:输出0 元数据:输出1 卡瓦酒:R
此列表显示当前可用的所有完整端口名称。它们对应于两个外部 JACK 客户端cava
和moc
以及一个内部 JACK 客户端system
。端口之间的类型和当前活动连接可以使用jack_lsp
的-p
和-c
开关列出。为了连接 CAVA 和 MOC 的端口,使用jack_connect
:
$ jack_connect cava:L moc:output0 $ jack_connect cava:R moc:output1
现在 CAVA 可以可视化从 MOC 输出的音频。
squeezelite 是可用于 Logitech Media Server 的多种软件客户端之一。 Squeezelite 可以将其音频数据导出为共享内存,这正是该输入模块所使用的。只需调整您的配置:
method = shmem source = /squeezelite-AA:BB:CC:DD:EE:FF
其中AA:BB:CC:DD:EE:FF
是squeezelite 的MAC 地址(如果不确定,请检查LMS Web GUI(设置>信息))。注意:squeezelite 必须以-v
标志启动才能启用可视化工具支持。
注意:Cava 在默认 macOS 终端中无法正确渲染。为了获得最佳显示效果,请安装 Kitty。请注意,您可能会遇到 #109 中提出的问题;不过,可以用这个来解决。
背景音乐
安装自动提供环回接口的背景音乐。安装并运行后,只需编辑您的配置即可将此接口与 portaudio 一起使用:
method = portaudio source = "Background Music"
音花
Soundflower 还可以创建环回接口。使用音频 MIDI 设置来配置一个虚拟接口,该接口将音频输出到扬声器和环回接口,遵循本节。通过创建多输出设备,您将失去控制键盘音量的能力。因此,我们推荐背景音乐应用程序,它仍然为您提供键盘控制。
然后编辑您的配置以将此接口与 portaudio 一起使用:
method = portaudio source = "Soundflower (2ch)"
应自动从默认输出设备捕获音频。
要通过 ssh 运行到外部监视器,请将输出重定向到/dev/console
:
~# ./cava <> /dev/console >&0 2>&1
使用 ctrl+z 退出,然后运行“bg”以使其在注销后保持运行。
(您必须是 root 才能重定向到控制台。简单的 sudo 是不够的:首先运行sudo su
。)
最有可能的问题#399。需要正确设置区域设置才能使 cava 正常工作。
这是管道的一个已知问题。尝试此处描述的解决方法
这要么是字体问题,要么是终端仿真器中启用的行间距问题。尝试更改字体或禁用行距。
由于图形只是基于字符,因此请尝试减小字体大小。
有些终端模拟器速度很慢。 Cava 在基于 GPU 的终端(如 kitty 或 alacritty)中看起来效果最好。您也可以尝试增大字体大小
如果您在 TTY 中运行 cava(如 ctrl+alt+F2),程序会将字体更改为包含的cava.psf
(实际上是稍作修改的“unifont”)。
在控制台字体中,似乎仅支持 256 个 Unicode 字符,可能是因为它们是位图字体。我找不到带有 Unicode 字符 2581-2587 的字体(每个条顶部使用的 1/8 - 7/8 块以提高分辨率)。
因此,在cava.psf
中,字符 1-7 实际上被 Unicode 字符 2581-2587 替换。当 cava 退出时,它会将字体更改回来。如果 cava 异常退出,并且您发现 1-7 被部分块替换,只需使用setfont
更改字体即可。
实际上, setfont
应该返回默认字体,但这通常没有设置。我还没有找到其他方法来获取当前字体。因此cava在中断时将字体设置为“Lat2-Fixed16”。所有主要发行版都应该有它。重启后它将恢复为默认字体。
Konsole 根本不支持这一点。第194章
Usage : cava [options] Visualize audio input in terminal. Options: -p path to config file -v print version
使用 ctrl+c 或 q 退出。
如果 cava 意外退出或被强制终止,则必须使用stty -echo
手动打开 echo。
钥匙 | 描述 |
---|---|
上/下 | 增加/减少灵敏度 |
左/右 | 增加/减少条形宽度 |
前/后 | 改变前景色/背景色 |
r | 重新加载配置 |
c | 仅重新加载颜色 |
q或CTRL-C | 退出卡瓦 |
从版本 0.4.0 开始,所有选项都在配置文件中完成,不再需要命令行参数!
默认情况下,首次启动时会在$XDG_CONFIG_HOME/cava/config
或$HOME/.config/cava/config
中创建配置文件,但也可以通过-p
选项使 cava 使用不同的文件。
向 cava 发送 SIGUSR1 信号,将强制 cava 重新加载其配置文件。因此,它的行为就像用户在终端中按r一样。可以使用pkill
或killall
发送 SIGUSR1 信号。例如:
$ pkill -USR1 cava
同样,向 cava 发送 SIGUSR2 信号只会从配置文件中重新加载颜色,这与在终端中按c相同。这比重新加载整个配置稍快,因为音频处理不需要重新初始化。
$ pkill -USR2 cava
有关均衡器工作原理的示例:
[eq] 1=0 2=1 3=0 4=1 5=0
[eq] 1=2 2=2 3=1 4=1 5=0.5
cava 中的核心处理引擎已拆分为单独的库cavacore
。有关详细信息,请参阅 CAVACORE.md。
您还可以通过使用原始输出模式将 Cava 的输出用于其他程序,该模式会将条形数据写入STDOUT
,然后通过管道传输到其他进程。有关此选项的更多信息记录在示例配置文件中。
可以在此处找到用 python 编写的使用原始数据的有用起点示例脚本。
请在打开拉取请求之前阅读 CONTRIBUTING.md。
由于:
天海象
红豆
利维贝特
在此项目的早期开发中做出了重大贡献。
还要感谢 dpayne 弄清楚如何找到pulseaudio默认接收器名称。