如何在命令行中控制均衡器?

如何在命令行中控制均衡器?

所以 Pulseaudio 有一个内置均衡器,加载了

模块均衡器接收器

根据http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Equalizer,您可以使用 qpaeq GUI 来控制它。

有没有办法在 Xless 系统上配置 PA 均衡器(在会话模式下运行)?

答案1

这是一个改编自qpaeqPulseaudio 附带的脚本:

#!/usr/bin/env python
# pulse-set-eq
import os,math,sys
import dbus

# Source adapted from utils/qpaeq of PulseAudio

def connect(): # copied from qpaeq
    try:
        if 'PULSE_DBUS_SERVER' in os.environ:
            address = os.environ['PULSE_DBUS_SERVER']
        else:
            bus = dbus.SessionBus() # Should be UserBus, but D-Bus doesn't implement that yet.
            server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
            address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface='org.freedesktop.DBus.Properties')
        return dbus.connection.Connection(address)
    except Exception as e:
        sys.stderr.write('There was an error connecting to pulseaudio, '
                         'please make sure you have the pulseaudio dbus '
                         'module loaded, exiting...\n')
        sys.exit(-1)

def get_sink(str):
    connection=connect()
    path='/org/pulseaudio/core1/sink%s'%str
    sink=connection.get_object(object_path=path)
    return sink

args = sys.argv[1:]
if len(args)<5:
    print("Usage: "+sys.argv[0]+" SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2...]")
    sys.exit()


sinknum = args.pop(0);
sink = get_sink(sinknum);

prop_iface='org.freedesktop.DBus.Properties'
eq_iface='org.PulseAudio.Ext.Equalizing1.Equalizer'
sink_props=dbus.Interface(sink,dbus_interface=prop_iface)

def get_eq_attr(attr):
    return sink_props.Get(eq_iface,attr)

sample_rate=get_eq_attr('SampleRate')
filter_rate=get_eq_attr('FilterSampleRate')
nchannels=get_eq_attr('NChannels')

sys.stderr.write('channels %d, sample rate: %f, filter sample rate: %f\n'%
    (nchannels, sample_rate, filter_rate))

channel = int(args.pop(0));
preamp = float(args.pop(0));

freqs = [];
coeffs = [];
while len(args) > 0:
    if len(args)==1:
        sys.stderr.write('Odd number of frequency/amplification arguments (%d)\n'%(len(freqs)*2+1))
        sys.exit(-1)
    sys.stderr.write('(%s, %s)\n'%(args[0],args[1]))
    freqs.append(float(args.pop(0)))
    coeffs.append(float(args.pop(0)))

#sys.stderr.write("freqs: "+str(freqs)+'\n');

freqs = list([int(round(x*filter_rate/sample_rate)) for x in freqs])
#sys.stderr.write("translated freqs: "+str(freqs)+'\n');

freqs = [0]+freqs+[filter_rate//2];
coeffs = [coeffs[0]]+coeffs+[coeffs[-1]];
#sys.stderr.write("proper freqs: "+str(freqs)+'\n');

# for some reason this fixes the types of the arguments to SeedFilter
sink=dbus.Interface(sink,dbus_interface=eq_iface)

# set the filter coefficients
sink.SeedFilter(channel,freqs,coeffs,preamp)

用法 :

使用 获取接收器编号pacmd list-sinks,然后

./pulse-set-eq SINK_NUM CHANNEL_NUM PREAMP_VALUE FREQ1 COEF1 [FREQ2 COEF2 …]

请注意,CHANNEL_NUM 0 似乎将对应于第一个通道,1 对应于第二个通道,依此类推,如果您使用实际通道数(例如,如果您有两个通道,则为 2),它将为所有通道设置均衡。

您可以随时使用 检查应用的设置qpaeq

先决条件:

请注意,首先您要加载均衡器模块以及 DBus 协议模块:

pactl load-module module-dbus-protocol
pactl load-module module-equalizer-sink sink_name=... sink_master=...
pactl set-default-sink ...

玩转脚本

然后发出一些声音,或音乐或其他什么:

play -n synth pinknoise gain -10

然后使用接收器编号、要应用均衡器的通道索引、前置放大器(缩放)因子以及(频率、系数)对列表来调用脚本。频率列表不必很密集,因为它是经过插值(参见seed_filterpulseaudio/src/modules/module-equalizer-sink.c来获取滤波器系数的。如果您指定通道总数作为通道索引,则更新将应用于所有通道。用于pacmd list-sinks获取接收器编号。

例如,如果接收器编号为 $SINKNUM 并且它有 2 个通道,则这会将均衡器重置为全 1,您可以通过打开来验证qpaeq

./pulse-set-eq $SINKNUM 2 1.0    100 1.0

这里 100 Hz 是任意的;该列表不能为空且不能从零开始。频率必须在 0 到 32768 之间(对我来说是最大值,不确定它是否可配置,请参阅filter_rate上面的变量 - 这是一半)。该脚本使用命令行上指定的最小和最大频率的放大系数,分别用于低于和高于这些频率的频率,因此在这种情况下,整个频谱将被指定放大率为 1.0。在此设置下,均衡器将使信号保持不变(至少理论上如此)。

小心不要损坏扬声器,但例如,您可以通过创建粉红噪声并将均衡器设置为单一频率 (500Hz) 的尖峰(100 倍放大)来进行尝试:

./pulse-set-eq $SINKNUM 2 1.0    499 0 500 100 501 0

当我这样做时,我可以听到一系列不同随机音量的离散音调,全部频率为 500Hz,我认为它们属于滤波器实现中的连续 DFT 窗口。倒是有些令人愉快。通过这个过滤器播放音乐很有趣。使用没有命令行版本的普通图形均衡器是不可能实现如此清晰的“带通”的。

下面的示例制作了一个频率上下波动的滤波器,有点像警报器。显然,你必须播放一些音乐或噪音或其他东西才能听到效果。

SINKNUM=12; NCHAN=2;
while true; do
    for i in $(seq 500 10 1500) $(seq 1500 -10 500); do
        ./pulse-set-eq $SINKNUM $NCHAN 1 \
            0 1 $(( $i - 300 )) 1 \
            $i 5 $(( $i + 300 )) 1 \
            32768 1;
    done;
done

答案2

脉冲音频均衡器正在读取用户文件中的设置〜/.config/pulse/equalizerrc

要显示它:

cat ~/.config/pulse/equalizerrc

因此,作为示例,在 eq 的第 5 个频段上给出 10DB 的值,并直接接收变化:

sed -i '19s/.*/10.0/' ~/.config/pulse/equalizerrc | pulseaudio-equalizer toggle

进一步解释一下,sed将替换所有编号的行19,并将其替换为10.0在配置文件上,然后重新启动/切换均衡器以获得结果。

答案3

答案是您不能使用简单的本机命令。

您可以使用更复杂的东西,例如:

$ pactl load-module module-ladspa-sink sink_name=FonsParamEQ master=alsa_output.pci-0000_03_06.0.analog-stereo plugin=filters label=Parametric1 control=1,0,1,49,0.5,3,1,1000,0.5,2,1,10000,0.5,3,1,13500,0.5,-12

我不知道它是如何工作的,我提到作为你搜索的参考;-)

但 python 脚本可以工作。

更多信息...使用“qpaeq”,您会发现“~/.config/pulse/equalizer-presets.tdb”,即“Samba Trivial DB”,可以使用 tdb-tool 查看(如注释)。

名为“~/.config/pulse/equalizerrc”的文件属于其他包,即“pulseaudio-equalizer”(其他应用程序,对我来说更好)

我没有业力评论其他帖子,抱歉冗余。

我希望它有帮助。

问候

答案4

我相信命令是pacmd.

编辑:

如果你去:

/usr/share/pulseaudio/alsa-mixer/profile-sets

您会发现许多配置文件。您可能想尝试编辑default.conf

相关内容