कमांड लाइन से पल्सीडियो वॉल्यूम पढ़ें? (मैं चाहता हूं: "पैक्टल GET- सिंक-वॉल्यूम")


25

मैं उस मात्रा स्तर को पढ़ना चाहता हूं जिसे मैं निर्धारित कर सकता हूं

pactl set-sink-volume $SINK $VOLUME

क्या ऐसा करने का एक आसान तरीका है? काल्पनिक जितना आसान है

pactl get-sink-volume $SINK

?

(मैं क्या करने की कोशिश कर रहा हूं? मैं वॉल्यूम सेट करने के लिए पैक्टल का उपयोग करता हूं और यह मुझे वॉल्यूम 100% से अधिक सेट करने देता है जो एक बुरा विचार है (ध्वनि की गुणवत्ता नीचे जाती है), इसलिए मैं एक छोटी स्क्रिप्ट लिखने के बारे में सोच रहा हूं जो 100% से अधिक नहीं। इसे पढ़ें। कुछ सीमा से अधिक। 100% पर सेट करें। नीचे, 1% जोड़ें। यदि ऐसा करने का एक और तरीका है, तो महान, मुझे बताएं! सबसे साफ समाधान शायद पल्स को सिर्फ रोकने के लिए बताना होगा। 100% पर। लेकिन मूल प्रश्न बना हुआ है, कोई रास्ता होना चाहिए ..)

अगर कोई फर्क पड़ता है तो मैं डेबियन पर हूं।


pactl list sinksआपको वॉल्यूम देता है, लेकिन सेट-सिंक-वॉल्यूम जैसे अच्छे आसान प्रारूप में नहीं।
derobert

2
इसमें से वॉल्यूम को पार्स करने के लिए एक अच्छा पर्ल-ऑनलाइनर देने वाले उत्तर के साथ पूछें उबंटू पर एक सवाल है ।
एंड्रियास विसे

@derobert धन्यवाद, मैं बस grep और / या इसे वहाँ से बाहर कर दूँगा!
हिगेमारु

@AndreasWiese धन्यवाद, यह नहीं देखा। मैंने पर्ल कोड पर एक त्वरित नज़र डाली, लेकिन मुझे लगता है कि मैं सिर्फ अपनी छोटी सी स्क्रिप्ट लिखूंगा। ;-)
हिगेमारू

जवाबों:


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

मेरे पास यही है। यह साफ नहीं है, लेकिन यह मेरे उपयोग के लिए पर्याप्त था। मुझे ऐसा करने का तरीका नहीं मिला । pactlसिर्फ एक ही सिंक के लिए लिस्टिंग होने का कोई साधन नहीं है प्रतीत नहीं होता है, लेकिन वे आरोही क्रम में मुद्रित कर रहे हैं। ताकि nth लाइन का उपयोग कर चयन करें tailऔर head। ध्यान दें कि वॉल्यूम लाइन में दाएं और बाएं चैनलों के लिए अलग-अलग वॉल्यूम हो सकते हैं और यह sedविकल्प केवल पहले वाले को चुनता है, क्योंकि मुझे बस उसी की आवश्यकता थी।

रिकॉर्ड के लिए, मैं pactl list sinks shortअपनी सक्रिय सिंक संख्या प्राप्त करने के लिए उपयोग करता हूं:

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

EDIT 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
कौशिक

मजबूती के लिए मैं सुझाव दूंगा LC_ALL=C pactl list sinks | grepक्योंकि "वॉल्यूम:" टेक्स्ट उपयोगकर्ता की भाषा में स्थानीय हो सकता है।
मारियस गेदमिनस

चूँकि मेरे पास केवल एक सिंक है, इसने मेरे लिए एक बैश स्क्रिप्ट में काम किया:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
मैथियास ब्रौन

11

यदि आपके पास एक और कार्यक्रम का उपयोग करने के लिए प्रतिबंध नहीं है, तो वहाँ है pamixer

आप इसके साथ वॉल्यूम प्राप्त कर सकते हैं:

$ pamixer --get-volume

4
डेबियन में, आप pulsemixerपैकेज का उपयोग कर सकते हैं । यह उसी के बारे में दिखता है।
जोसेफ कुफनर 21

8

ध्यान दें कि टॉमी किन्नटोला का उत्तर उपयोग में होने वाली सिंक पर निर्भर करता है ताकि आप वास्तव में सिंक नंबर प्राप्त कर सकें।

यह भी ध्यान दें कि यह नामांकित अनुक्रमित पर निर्भर करता है कि गिने हुए सूचकांक के समान हो । मान लीजिए, उदाहरण के लिए, हमारे पास 3 सिंक 1, 2 और 3 हैं और वह 3 हमारा चयनित सिंक है, हम नंबर 2 को डिस्कनेक्ट करते हैं, हमें 1 और 3 के साथ छोड़ देते हैं। अब आप टॉमी किन्नटोला के घोल के साथ 3 को सिंक करने की गिनती नहीं कर सकते क्योंकि pactl list sinks | grep "^[[:space:]]Volume:"केवल 2 वॉल्यूम फ़ील्ड्स का उत्पादन करेगा, इस प्रकार $SINK + 1'वें लाइन से काम नहीं चलेगा।

मेरा समाधान इस धारणा पर आधारित है कि pacmd हमेशा एक विशिष्ट क्रम में सिंक को सूचीबद्ध करेगा। यदि आप अधिक विश्वसनीय समाधान चाहते हैं, तो आपको आउटपुट पार्स करने की आवश्यकता है।

#!/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) में मिल रहा है, आपके चैनल विभिन्न स्तरों पर हो सकते हैं।


संपादित करें:

दूसरे सोचा पर आप वास्तव में 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
}

धन्यवाद! आपका दूसरा उपाय शानदार काम करता है। हालाँकि, मुझे लगता है कि सेटडेफुलिंकविसोल () होना चाहिएpactl set-sink-volume $(getdefaultsinkname) "$1"
मोनिका सेलियो के लिए माउंटेनएक्स

4

वॉल्यूम पाने के लिए मैं यह कोशिश कर रहा हूं:

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

3
नोट: 'वॉल्यूम' मूल भाषा में अनुवादित है, इसलिए यह केवल अंग्रेजी सिस्टम के लिए काम करेगा।

3
यदि आपके पास कई सिंक हैं तो यह आउटपुट की कई लाइनें देगा।
10

4

बहुभाषी प्रकार:

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

पैक्टल 5.0 पर परीक्षण किया गया


क्या आप एक स्पष्टीकरण जोड़ सकते हैं?
कोड ब्लिंग

4

जैसा कि मैं अभी तक टिप्पणी नहीं कर सकता (@ jgr के उत्तर पर सुधार करने के लिए विशेष रूप से साइन अप किया गया), इस मामले में कि आपका डिफ़ॉल्ट सिंक एक प्लगइन है (किसी भी प्रकार के लैडस्पा प्लगर्स) उसका संपादित समाधान XX% वापस आ जाएगा, (अनुगामी अल्पविराम पर ध्यान दें) ), इसलिए यह उससे थोड़ा बेहतर काम करता है। क्षमा करें, मेरा awk-fu बहुत बुनियादी है, मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है।

संशोधित समाधान '%' को भी छोड़ देता है क्योंकि मुझे इसे रखने की बात नहीं दिखती है, और यदि हम सिर्फ वह संख्या लौटाते हैं जिसे हम गणित में उपयोग कर सकते हैं। सेटवॉल केस भी तय किया, जिसे मेरे मामले में विशिष्ट निर्देशों की जरूरत है।

#/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या sedकर सकते हैं perl

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.