명령줄에서 이퀄라이저를 제어하는 ​​방법은 무엇입니까?

명령줄에서 이퀄라이저를 제어하는 ​​방법은 무엇입니까?

따라서 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_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

여기서 100Hz는 임의적입니다. 목록은 비어 있을 수 없으며 0부터 시작할 수 없습니다. 빈도는 0에서 32768 사이여야 합니다(이는 최대값입니다. 구성 가능한지 확실하지 않습니다. filter_rate위의 변수를 참조하세요. 절반입니다). 스크립트는 해당 주파수 이하 및 이상의 주파수에 대해 각각 최소 및 최대 주파수에 대해 명령줄에 지정된 증폭 계수를 사용하므로 이 경우 전체 스펙트럼에 증폭 계수 1.0이 할당됩니다. 이 설정에서 이퀄라이저는 신호를 변경하지 않은 상태로 유지합니다(적어도 이론상으로는).

스피커가 손상되지 않도록 주의하세요. 예를 들어 핑크 노이즈를 생성하고 이퀄라이저를 단일 주파수(500Hz)(100x 증폭)의 스파이크로 설정하여 시도해 볼 수 있습니다.

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

이렇게 하면 필터 구현의 연속 DFT 창에 속한다고 가정하는 500Hz에서 다양한 무작위 볼륨의 일련의 개별 톤을 들을 수 있습니다. 다소 즐거웠습니다. 이 필터를 통해 음악을 재생하는 것은 재미있습니다. 명령줄 버전이 없는 일반 그래픽 이퀄라이저를 사용하여 이렇게 명확한 "대역통과"를 달성하는 것은 불가능합니다.

아래 예에서는 사이렌처럼 주파수가 위아래로 움직이는 필터를 만듭니다. 분명히 효과를 들으려면 음악이나 소음 등을 재생해야 합니다.

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

Pulse Audio Equalizer가 사용자 파일에서 설정을 읽는 중입니다.~/.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"를 사용하면 "Samba Trivial DB"인 "~/.config/pulse/equalizer-presets.tdb"를 찾을 수 있으며, tdb-tool(주석 포함)로 볼 수 있습니다.

"~/.config/pulse/equalizerrc"라는 파일은 다른 패키지, 즉 "pulseaudio-equalizer"(다른 응용 프로그램, 나에게 더 좋음)에 속합니다.

다른 게시물에 댓글을 달 능력이 없어서 중복해서 죄송합니다.

도움이 되었으면 좋겠습니다.

인사

답변4

나는 그 명령이 이라고 믿는다 pacmd.

편집하다:

당신이 가면 :

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

많은 구성 파일을 찾을 수 있습니다. 편집해 보세요 default.conf.

관련 정보