2012-05-24 5 views
24

Comment changer par programme le volume dans Gnome sur Ubuntu, soit à partir de la ligne de commande ou d'une API (de préférence Python)?Comment changer le volume par programme dans Ubuntu

Les seules réponses que j'ai trouvées à des questions similaires utilisent amixer, ce qui semble n'avoir aucun effet sur Ubuntu 12.04. Exécution:

amixer set Headphone 10- 

montre:

Simple mixer control 'Headphone',0 
    Capabilities: pvolume pswitch penum 
    Playback channels: Front Left - Front Right 
    Limits: Playback 0 - 115 
    Mono: 
    Front Left: Playback 0 [57%] [-57.50dB] [on] 
    Front Right: Playback 0 [57%] [-57.50dB] [on] 

Le x% change à chaque fois que je le lance. Malheureusement, cela n'a aucun effet sur le volume réel. Finalement, il dit 0%, mais le volume est toujours à son maximum.

L'autre inconvénient est que je dois spécifier le périphérique de sortie actif exact, que je ne sais pas s'il y a plusieurs périphériques. Par exemple, si j'ai un "Master" et un "Headphone", comment puis-je déterminer quel est le périphérique actif?

+3

Juste une conjecture: est-ce que '' amixer set Master 10-'fonctionne? Changer le volume principal affecterait tous les autres canaux. Pour autant que je sache. – aland

+2

@aland: '' amixer set Master 10-'fonctionne. – jfs

+0

amixer n'a aucun effet, quel que soit le périphérique que je spécifie ... – Cerin

Répondre

38

Ubuntu utilise pulseaudio comme serveur de son. Il peut être contrôlé à partir de la ligne de commande en utilisant les utilitaires pactl et pacmd, par exemple:

pactl set-sink-volume 0 20% 

fixerait le volume du puits # 0 à 20%.

voir: man pactl et pacmd help


modifier:

pour éviter -xx être interprété comme option de ligne de commande, vous devez préfixer avec --. Cela arrête l'analyse de l'option à partir de ce point:

pactl set-sink-volume 0 -- -20% # or: 
pactl -- set-sink-volume 0 -20% # doesn't matter where the `--` goes 
+1

Comment régler les changements de volume relatifs? La page de manuel indique "Si la spécification du volume commence par un + ou - le réglage du volume sera relatif au volume du récepteur actuel". mais faire 'pactl set-sink-volume 0 -10%' me donne l'erreur "pactl: option invalide - '1'" – Cerin

+0

@Cerin - c'est un problème commun avec l'analyse des options dans le shell ... mis à jour ma réponse. – mata

+0

Merci pour la clarification. – Cerin

15

Je le fais en utilisant ALSA mélangeur. Vous avez probablement besoin de télécharger python-alsaaudio

sudo apt-get install python-alsaaudio 

ensuite de contrôler le volume,

import alsaaudio 
m = alsaaudio.Mixer() # defined alsaaudio.Mixer to change volume 
m.setvolume(50) # set volume 
vol = m.getvolume() # get volume float value 

Lire http://pyalsaaudio.sourceforge.net/libalsaaudio.html savoir sur alsaaudio bibliothèque dans les détails.

+0

Ubuntu ne semble plus utiliser Alsa ... – Cerin

+0

Je sais mais j'utilise Ubuntu 12.04 et cela fonctionne toujours. Donc, je suppose que vous pouvez l'utiliser. – Froyo

+0

Bizarre. J'utilise aussi 12.04, sur un macbook, et aucun des utilitaires alsa ne fonctionne pour moi. Cependant, tous les utils pulseaudio fonctionnent parfaitement ... – Cerin

2

Extrait de code pour lire le volume (n'oubliez pas que le volume dépasse "100%" sur ubuntu - à ce moment-là, il renvoie ~ 0.66).

#!/usr/bin/python 
import subprocess 

vol = int(filter(lambda l: l.startswith('set-sink-volume'), 
      subprocess.check_output(["pacmd","dump"]) 
      .split('\n'))[0] 
      .split()[-1],16)/100000. 

print vol 
6

amixer commande travaillé dans Ubuntu 13,04,

Augmenter le volume de 5%
amixer -D pulse sset Master 5%+

Diminution du volume de 5%
amixer -D pulse sset Master 5%-

pactl ou pacmd ne fonctionnait pas correctement pour moi dans Ubuntu 13.04.

+0

Les deux proposés 'amixer set Master 10-'et vos commandes fonctionnent pour moi, merci! – VasyaNovikov

1

Vous pouvez également essayer le simple et élégant ponymix utill. Il est très facile d'augmenter/diminuer le volume, bascule (mute/unmute) l'audio, etc.

d'abord obtenir une liste des sources audio disponibles avec ponymix

Dans mon cas, je peux voir une fois puits 0 et source 0. Je peux utiliser soit le numéro ou le nom complet, intégré audio numérique stéréo (HDMI), pour contrôler l'audio.

Augmenter le volume de la carte 0 de 5%: ponymix -c 0 increase 5

diminuer le volume de la carte 0 de 5%: ponymix -c 0 decrease 5

1

Je recommande cet outil qui contrôle PulseAudio: https://github.com/graysky2/pulseaudio-ctl

[email protected] ~ $ pulseaudio-ctl 
pulseaudio-ctl v1.63 

/usr/bin/pulseaudio-ctl {up,down,mute,mute-input,set,atmost,full-status} [n] 

Where up and down adjust volume in ±5 % increments 
Where up and down [n] adjust volume in ±n % increments 
Where mute toggles the mute status on/off 
Where mute-input toggles the input status on/off 
Where set set the volume to [n] % 
Where atmost only takes effect if current volume is higher than [n] 
Where full-status prints volume level, sink and source mute state to stdout 

Optionally, redefine an upper threshold in /home/me/.config/pulseaudio-ctl/config 

Volume level  : 80 % 
Is sink muted : no 
Is source muted : no 
Detected sink : 1 
Detected source : 3 
Pulse version : 8.0 
[email protected] ~ $ 
Questions connexes