测试音频设备/声卡当前是否正在播放?


9

是否有一个默认程序,我可以在其中检查音频设备是否处于静音状态?

编辑:通过沉默,我的意思是如果那上面正在播放某些东西(不仅仅是激活或打开)

像这样:

if [[ device0 is silent ]] ; then
    radio $RANDOM
fi

编辑2:我要实现的是一个脚本,该脚本可以播放广播,并且可以在播放器出现故障时继续播放,例如,如果互联网连接断开并且播放器没有恢复,我将杀死播放器并重新开始


您的意思是检查音量的工具吗?
Eddy_Em

不,请检查是否有游戏在玩
RSFalcon7 2013年

1
那么我猜唯一的警告就是检查alsamixer中的“ Mix”并尝试从声卡中录制一些声音,然后对录制文件中的音量进行分析。如果大于阈值,则表示没有任何游戏。尝试例如sox。在其他情况下,您可以尝试lsof|grep snd。如果什么都没有,您可以打开收音机。
Eddy_Em 2013年

还问了超级用户
格伦

Answers:


4

如果您使用的是PulseAudio(基于Gnome的Linux发行版倾向于使用PulseAudio,则可以检查是否正在运行ps -C pulseaudio),并且想知道某些应用程序是否正在将任何数据发送到任何“接收器”,则可以执行以下操作:

pacmd list-sink-inputs | grep -c 'state: RUNNING'

仍然使用PulseAudio,如果您要检查声音输出是否已静音,则可能更简单,但您可以使用以下方法获取默认“接收器”的“静音”状态:

pacmd dump | awk '
  $1 == "set-sink-mute" {m[$2] = $3}
  $1 == "set-default-sink" {s = $2}
  END {print m[s]}'

我不确定自己在使用什么,但是此脚本不适用于我。(no无论是否玩,它都会“返回” )
RSFalcon7 2013年

抱歉,我错过了那部分。我仍然不认为这是在执行所要求的操作:如果应用程序打开了设备但没有提供任何数据,那么它是否会给出假肯定?
吉尔斯(Gilles)'“ SO-别再邪恶了”

1
@Gilles,在我的测试中(暂停mplayer),它给出State: CORKED的结果State: RUNNING是,而不是这种情况,因此它仍然可以工作。如果应用程序提供了静音数据(正在播放静音),那么我想它仍然会显示RUNNING,但是在那种情况下,除了在所有接收器的监视设备上使用pamon 并检查静音之外,我没有其他选择。
斯特凡Chazelas

我测试了,它正在工作。谢谢@Stephane,如果可以的话,我将全力支持您!
RSFalcon7 2013年

3

如果我理解正确,请举一个例子:

安静:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
There's silence

我打开大胆的:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
/dev/snd/timer:      47663
Something is playing

对于OSS缠得/dev/snd/timer/dev/dsp

这是一个非常依赖的方法。


在我的家庭作业(linux.amazingdev.com/blog/archives/000909.html)中,似乎进程正在握住设备,但实际上并未播放任何内容。真的吗?(如果是这样,则没有用)
RSFalcon7 2013年

对,是真的。如果您按“暂停”或“静音”,将会如此。但是在这种情况下,您不能完全确定几秒钟后播放器不会再播放。或者,您可以结合使用此方法并从声卡中写入。
Eddy_Em 2013年

在这种情况下,我正在寻找一种克服玩家失败的方法,因此很遗憾,这种方法将行不通
RSFalcon7 2013年

1

假设您使用ALSA混音器来播放声音,则可以使用它amixer来查询有关音频设备的信息。音频设备通常具有多个音频通道-或控件-每个通道都可以静音和取消静音。例如,要检查Master控件是否被静音,您可以执行以下操作:

if amixer get Master | grep -q off; then
    # action
fi

使用该set选项可以在控件上执行操作。请参阅man amixer以获取更多帮助。


我编辑过,也许这个问题有点含糊。不幸的是amixer,它没有工作,我测试了15分钟以上,没有打开任何播放器,并且它仍然报告“未静音”
RSFalcon7 2013年

这将检查声音通道是否被静音,而不是是否正在播放某些声音。
吉尔斯(Gilles)'所以

1

htor的答案可能会起作用,但完全有可能在输出的其他位置出现“ off”,从而导致错误的结果。这是使用GNU awk进行的更严格的检查:

if amixer get Master | gawk 'END{ if ( $NF != "[off]" ) { exit 1 } }'; then
    # muted
else
    # unmuted
fi

amixer的最后一行没有$6:“单声道:回放[开]”。(amixer版本1.0.26)也许$NF会更便携。
manatwork

@manatwork感谢您的来信,输出看起来很可移植,但是我想我很容易被领到;-)
Chris Down

这将检查声音通道是否被静音,而不是是否正在播放某些声音。
吉尔(Gilles)'所以

@Gilles-当我发布此答案时,该问题并未描述该问题。
克里斯·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.