如何使用amixer切换声音?

包括Natty,我一直能够使用amixer sset Master toggle命令在CompizConfig-Manager中的边缘绑定上切换(静音/取消静音)“Master”声音音量。
现在,在安装Oneiric之后,该命令只会将声音静音,而不会取消静音。我甚至在终端中尝试了它,但也不起作用。它将“Mono: Playback 68 [78%] [-14.25dB] [off]”更改为“...[on]”,但声音仍然保持静音状态,所以我必须通过面板上的“sound-indicator”来取消静音。
我该如何使其再次正常工作?自从Natty以来有什么变化?有人知道“sound-indicator”用于切换声音音量的命令吗?

而且更奇怪的是:在我的另一台笔记本电脑上,我是从Natty升级到Oneiric,而不是重新安装,它仍然可以正常工作。 - joschi
8个回答

这个对我来说是有效的,无论是在13.04上静音还是取消静音。
amixer -D pulse set Master 1+ toggle

它指定了脉冲音频以确保取消静音,取消静音所有内容。


在Lubuntu 13.10上工作。找了好几个星期才找到这个! - luisgonzalez
1编辑:只有在终端中作为命令运行时才有效。但是当我尝试将其配置为键绑定时,出现以下错误:无法访问主目录:权限被拒绝 ALSA库pulse.c:243:(pulse_connect) PulseAudio:无法连接:连接被拒绝amixer:Mixer附加pulse错误:连接被拒绝 - luisgonzalez
9没有1+参数的话,它的效果会更好。 - J. Katzwinkel
4仍然适用于17.10(艺术)。我将其用于i3媒体绑定:bindsym XF86AudioMute exec --no-startup-id amixer -D pulse set Master 1+ toggle - Joel
41+的原因是什么? - Gayan Weerakutti
1在查阅手册后,我不确定。对我来说,这个没有1 +就可以正常工作:amixer set Master toggle - abelito

我正在使用这个脚本作为一种解决办法:
#!/bin/bash

CURRENT_STATE=`amixer get Master | egrep 'Playback.*?\[o' | egrep -o '\[o.+\]'`

if [[ $CURRENT_STATE == '[on]' ]]; then
    amixer set Master mute
else
    amixer set Master unmute
    amixer set Front unmute
    amixer set Headphone unmute
fi

我在调用amixer set Master mute之前和之后,对amixer scontents进行了比较,并使用图形界面取消静音以确定需要取消静音的内容。
使用命令amixer scontents > ~/before,可以获取一个包含所有声道状态的文件(带有声音的情况下)。
然后,可以使用命令amixer set Master toggle切换音量。
使用命令amixer scontents > ~/after创建第二个声道状态文件。
再次使用amixer set Master toggle命令切换声音,这应该会将音量调回到第一个切换命令之前的水平。
使用命令amixer scontents > ~/afterafter创建第三个文件。
现在,您有三个文件告诉您正常声音使用的声道状态,以及通过amixer set Master toggle静音的声道和无法通过相同命令取消静音的声道。
为了轻松比较这些文件并查看差异(静音并且无法解除静音的声道),您可以在软件中心使用meld。启动它,打开这三个文件,然后在滚动条上可以看到文件之间的差异。使用找到的声道名称将它们添加到上述描述的脚本中。

很遗憾,这个脚本只能将声音静音,无法取消静音。 - joschi
这可能是因为您需要取消静音的设备不像我的系统上那样被称为“前置”和“耳机”。 - Jim Hunziker
我还进行了一次比较,并找出了脚本在我的电脑上无法运行的原因,现在它可以正常工作了。非常感谢。 - joschi

我无法正确切换静音功能。无论是使用命令行输入"Amixer sset Master toggle"还是按下HP Pavilion媒体切换键,结果都是一样的:如果声音开启并正常工作,它会自动关闭主通道和PCM通道。然后当我再次按下切换键(无论是命令行还是键盘),它总是打开主通道,但保持PCM静音。对于我的设备(运行Xubuntu Oneric的HP Pavilion DV6),这意味着即使主通道打开,声音也是关闭的。从命令行运行时,结果也是一样的。如果我使用命令行切换PCM通道,它也会关闭主通道,并且无法再次打开,尽管PCM切换是正确的。
成功运行的脚本如下:
#!/bin/bash
    if amixer -c 0 get Master | grep -q off
then
    amixer set Master unmute
    amixer set PCM unmute

else
    amixer set Master mute
fi

然后我使用了 Xubuntu 的键绑定(设置> 设置管理器> 键盘> 应用程序快捷方式),浏览到了脚本(我将其命名为 sndfx.sh,并通过在 Thunar 中右键单击并在权限下勾选“使其可执行”进行了设置)。然后,我通过轻敲 HP Pavilion 快捷键将其分配给了该脚本。现在,它可以正确切换 - 太棒了。 希望这能帮助到其他人。
祝和平。

如果我没记错的话,这是一个导致其他混音通道静音和取消静音的错误。要静音,请尝试:
amixer set Master 0;
要取消静音,请尝试:
amixer set Master 1%+; amixer set Master 7dB+;

这些命令可以工作,但它们不能让我用一个单一的命令来切换音量,并且还能与边缘绑定结合使用。 - joschi
1如果有人对相关的错误报告感兴趣,请参见这里 - joschi

如果你想要替换.lircrc中的amixer,以便与lirc一起使用你的遥控器,你可以尝试以下几行代码。请确保已安装xmacro。音量控制现在又可以正常工作了。
begin
        prog = irexec
        button = KEY_VOLUMEUP
        repeat = 1
        delay = 2
        config = echo KeyStrPress XF86AudioRaiseVolume KeyStrRelease XF86AudioRaiseVolume | xmacroplay $DISPLAY
end
begin
        prog = irexec
        button = KEY_VOLUMEDOWN
        repeat = 1
        delay = 2
        config = echo KeyStrPress XF86AudioLowerVolume KeyStrRelease XF86AudioLowerVolume | xmacroplay $DISPLAY
end
begin
        prog = irexec
        button = KEY_MUTE
        config = echo KeyStrPress XF86AudioMute KeyStrRelease XF86AudioMute | xmacroplay $DISPLAY
end

窍门是根据耳机是否连接,使扬声器或耳机状态与主音量通道的状态保持一致。这个脚本对我的古老的戴尔Latitude笔记本电脑非常有效。
#!/bin/bash

amixer -q sset Master toggle

MASTER_STATE=`amixer get Master | awk -F"dB] " 'NR == 5 {print $2;}'`
HEADPHONES_PLUGGED=`amixer contents | grep -A 2 Headphone\ Jack | awk -F"=" 'NR == 3 {print $2;}'`

if [[ $HEADPHONES_PLUGGED == 'on' ]]; then
    SLAVE="Headphone"
else
    SLAVE="Speaker+LO"
fi

if [[ $MASTER_STATE == '[on]' ]]; then
    amixer -q sset $SLAVE unmute
else
    amixer -q sset $SLAVE mute
fi

你可能需要在电脑上使用amixer命令检查你的声道,并相应地更改SLAVE定义。另外,在HEADPHONES_PLUGGED定义中,“Headphone\ Jack” grep字符串可能需要更改为其他内容。

如有人在寻找其他解决方案,我使用了 pactl 命令。
要增加/降低音量,请使用。
pactl -- set-sink-volume 0 +10%

使用以下方法切换静音:
pactl -- set-sink-mute 0 toggle

阅读更多 PACTL命令和用法 通过命令行设置音频音量


暴力解除静音:
for i in $(amixer |grep -o \'.*\'); do amixer set $i unmute; done

2我不认为解除静音80多个设备是一个好主意。这包括麦克风,可能会导致不必要的反馈回路。在执行之前,可以使用for i in $(amixer |grep -o \'.*\'); do echo amixer set $i unmute; done命令查看将要执行的操作。 - user unknown