อ่านปริมาณ pulseaudio จาก commandline? (ฉันต้องการ:“ pactl GET-sink-volume”)


25

ฉันต้องการอ่านระดับเสียงที่ฉันสามารถตั้งค่าได้

pactl set-sink-volume $SINK $VOLUME

มีวิธีง่าย ๆ ในการทำเช่นนั้น? ง่ายเหมือนสมมติฐาน

pactl get-sink-volume $SINK

?

(สิ่งที่ฉันพยายามจะทำอย่างไรฉันใช้ pactl เพื่อตั้งค่าระดับเสียงและให้ฉันตั้งค่าระดับเสียงสูงกว่า 100% ซึ่งเป็นความคิดที่ไม่ดี (คุณภาพเสียงต่ำลง) ดังนั้นฉันจึงคิดว่าจะเขียนสคริปต์ขนาดเล็กที่จะ ไม่ไปเกิน 100% อ่านออกไปเกินขีด จำกัด หรือไม่ตั้งไว้ที่ 100% ด้านล่างเพิ่ม 1% ถ้ามีวิธีอื่นที่ดีเยี่ยมบอกฉันเลยวิธีแก้ปัญหาที่สะอาดที่สุดน่าจะบอกให้ชีพจรหยุด ที่ 100% แต่คำถามเดิมยังคงต้องมีวิธี .. )

ฉันอยู่ใน Debian ถ้ามันสร้างความแตกต่าง


pactl list sinksให้เสียง แต่ไม่ได้อยู่ในรูปแบบที่ดีเช่น set-sink-volume
derobert

2
มีคำถามในการถาม Ubuntuกับคำตอบที่ให้ perl-oneliner ที่ดีในการแยกเสียงออกจากนี้
Andreas Wiese

@derobert ขอบคุณฉันจะ grep และ / หรือเอามันออกจากที่นั่น!
Higemaru

@AndreasWiese ขอบคุณไม่เห็นว่า ฉันได้ดูรหัส perl อย่างรวดเร็ว แต่ฉันเดาว่าฉันจะเขียนสคริปต์ตัวน้อยที่สกปรกของตัวเอง ;-)
Higemaru

คำตอบ:


19
pactl list sinks | grep '^[[:space:]]Volume:' | \
    head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,'

นั่นคือสิ่งที่ฉันมี มันไม่เรียบร้อย แต่ก็เพียงพอสำหรับการใช้งานของฉัน ฉันหาทางทำไม่ได้ pactlเพียงแค่ดูเหมือนจะไม่ได้หมายถึงการได้รับรายชื่อหนึ่งจมเพียงใด แต่พวกเขาจะถูกพิมพ์ในลำดับ ดังนั้นเลือกที่บรรทัดที่ n ใช้และtail headโปรดสังเกตว่าบรรทัดเสียงอาจมีวอลลุ่มแยกต่างหากสำหรับช่องทางด้านขวาและซ้ายและที่ที่sedเลือกเพียงช่องแรกแทนเพราะฉันต้องการแค่นั้น

สำหรับบันทึกฉันใช้pactl list sinks shortเพื่อรับหมายเลข sink ของฉันที่ใช้งานอยู่:

pactl list short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'

แก้ไข 2017-10-05: ฉันต้องปรับแต่งเล็กน้อยเนื่องจากการเปลี่ยนแปลงใน pulseaudio นี่คือสิ่งที่ฉันมีตอนนี้:

SINK=$( pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1 )
NOW=$( pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' )

ฉันได้MODตั้งค่าเป็น +10 หรือ -10 และฉันได้ทำการตรวจสอบขอบเขตและสุดท้าย:

pactl set-sink-volume $SINK ${MOD}%

1
ขอบคุณ! ในการรับหมายเลขซิงค์ที่ใช้งานฉันจำเป็นต้องใช้pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- เพิ่มsinksระหว่างpactl listและshort
koushik

เพื่อความแข็งแกร่งฉันขอแนะนำLC_ALL=C pactl list sinks | grepเพราะข้อความ "Volume:" อาจถูกแปลเป็นภาษาของผู้ใช้
Marius Gedminas

เนื่องจากฉันมีอ่างล้างจานเพียงอันเดียวจึงเหมาะกับฉันในสคริปต์ Bash:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

หากคุณไม่ได้มีข้อ จำกัด pamixerในการใช้โปรแกรมอื่นมี

คุณสามารถรับระดับเสียงด้วย:

$ pamixer --get-volume

4
ใน Debian คุณสามารถใช้pulsemixerแพ็คเกจได้ มันดูเหมือนกัน
Josef Kufner

8

โปรดทราบว่าคำตอบของ Tommi Kyntola ขึ้นอยู่กับการใช้งานของอ่างล้างจานเพื่อให้คุณสามารถรับหมายเลข sink ได้จริง

นอกจากนี้โปรดทราบว่ามันอาศัยดัชนีอ่างล้างจานที่ระบุชื่อให้เหมือนกับดัชนีที่นับ ตัวอย่างเช่นเรามี 3 อ่าง 1, 2 และ 3 และ 3 นั้นคืออ่างที่เราเลือกเราก็ปลดหมายเลข 2 ออกจากเราด้วย 1 และ 3 ตอนนี้คุณไม่สามารถนับจม 3 ด้วยวิธีแก้ปัญหาของ Tommi Kyntola เพราะpactl list sinks | grep "^[[:space:]]Volume:"จะส่งออกเพียง 2 เขตข้อมูลปริมาณดังนั้นท่อไปที่หัว / หางเพื่อให้ได้$SINK + 1บรรทัด 'th จะไม่ทำงาน (ฉันเคยพบ irl นี้ฉันไม่ใช่แค่ nitpicking)

โซลูชันของฉันทำงานตามสมมติฐานที่ว่า pacmd จะแสดงรายการ sinks ตามลำดับที่ระบุเสมอ หากคุณต้องการโซลูชันที่น่าเชื่อถือมากขึ้นคุณจะต้องวิเคราะห์ผลลัพธ์

#!/bin/sh

# Get the index of the selected sink:
getsink() {
    pacmd list-sinks |
        awk '/index:/{i++} /* index:/{print i; exit}'
}

# Get the selected sink volume
getvolume() {
    pacmd list-sinks |
        awk '/^\svolume:/{i++} i=='$(getsink)'{print $5; exit}'
}

getvolume

หมายเหตุ: ฉันไม่รู้ว่าเขตข้อมูลปริมาณแตกต่างกันฉันมีลักษณะเช่นนี้ (จากpacmd list-sinks):

volume: front-left: 42706 /  65% / -11.16 dB,   front-right: 42706 /  65% / -11.16 dB

นอกจากนี้ฉันเพิ่งได้รับระดับเสียงของช่องแรก (ด้านหน้าซ้าย) ในรูปแบบเปอร์เซ็นต์ (เช่นช่อง 5) ช่องของคุณอาจอยู่ในระดับที่แตกต่างกัน


แก้ไข:

ในความคิดที่สองคุณอาจต้องการรับชื่อ sink เริ่มต้นจากpacmd statโซลูชันที่ซับซ้อนน้อยกว่า:

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}'

}

setdefaulsinkvol() {
    pactl $(getdefaultsinkname) $1
}

ขอบคุณ! โซลูชันที่สองของคุณใช้งานได้ดี อย่างไรก็ตามฉันคิดว่า setdefaulsinkvol () ต้องเป็นpactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX สำหรับ Monica Cellio

4

สำหรับการรับปริมาณฉันลองอันนี้:

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`

3
หมายเหตุ: 'ปริมาณ' เป็นภาษาที่แปลแล้วดังนั้นจะใช้งานได้กับระบบภาษาอังกฤษเท่านั้น

3
หากคุณมีหลาย sinks สิ่งนี้จะให้เอาต์พุตหลายบรรทัด
tremby

4

ตัวแปรหลายภาษา:

pactl list sink-inputs | \
grep -A15 -P "(\#|№)$SINK" | \
grep -P "\d+\s*\/\s*\d+\%" | \
head -1 | \
awk "{print \$5}"

ทดสอบกับ pactl 5.0


คุณสามารถเพิ่มคำอธิบายได้ไหม?
รหัส Bling

4

เนื่องจากฉันยังไม่สามารถแสดงความคิดเห็นได้ (ลงทะเบียนโดยเฉพาะเพื่อปรับปรุงคำตอบของ @ jgr) ในกรณีที่ sink เริ่มต้นของคุณเป็นปลั๊กอิน (เช่นปลั๊กอิน ladspa จำนวนมาก) วิธีแก้ไขของเขาจะคืน XX% (โปรดสังเกตเครื่องหมายคอมม่าต่อท้าย ) ดังนั้นจึงใช้งานได้ดีกว่านั้นเล็กน้อย ขออภัย awk-fu ของฉันธรรมดามากฉันแน่ใจว่ามีวิธีที่ดีกว่าในการทำเช่นนี้

โซลูชันที่ปรับเปลี่ยนยังไม่ใช้ '%' เนื่องจากฉันไม่เห็นจุดที่จะเก็บมันไว้และถ้าเราคืนค่าจำนวนที่เราสามารถใช้ในคณิตศาสตร์ แก้ไขกรณี setvol ซึ่งต้องการคำแนะนำเฉพาะในกรณีของฉัน

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}' |
        awk -F"%" '{print $1}'
}

setdefaultsinkvol() {
    pactl -- set-sink-volume $(getdefaultsinkname) $1
}

2

คุณสามารถใช้amixerเพื่ออ่านระดับเสียง pulseaudio โดยใช้ตัวเลือกตัวผสมเช่นนี้

$ amixer -c $CARD -M -D $MIXER get $SCONTROL
# CARD is your sound card number, mixer is either alsa or pulse and scontrol is the alsa device name, Master if you want to use pulse.
$ amixer -c 1 -M -D pulse get Master

Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Mono:
  Front Left: Playback 27662 [42%] [on]
  Front Right: Playback 27662 [42%] [on]

ตอนนี้เราสามารถแยกได้โดยใช้grepหรือหรือsedperl

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.