所以 Pulseaudio 有一个内置均衡器,加载了
模块均衡器接收器
根据http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Equalizer,您可以使用 qpaeq GUI 来控制它。
有没有办法在 Xless 系统上配置 PA 均衡器(在会话模式下运行)?
答案1
这是一个改编自qpaeq
Pulseaudio 附带的脚本:
#!/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_filter
)pulseaudio/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
。