使用php exec和amixer设置音量

Mar*_*der 14 php apache exec alsa amixer

我写了一个小的PHP脚本来控制alsa本地机器的音量:

<?php
# for simplicity and testing it really just executes the command:
echo exec('amixer set Master 5%+') . " \n";
Run Code Online (Sandbox Code Playgroud)

现在,当我在命令行上运行此脚本时,它工作正常:

$ php volume.php 
Front Right: Playback 39226 [60%] [on] 
$ php volume.php 
Front Right: Playback 42503 [65%] [on] 
$ php volume.php 
Front Right: Playback 45780 [70%] [on]
Run Code Online (Sandbox Code Playgroud)

我有音乐播放,我听到声音越来越大.

但是当我尝试从浏览器通过apache运行脚本时调用http://localhost/volume.php它不起作用.

# http://localhost/volume.php
Front Right: Playback 55709 [10%] [on]
# F5
Front Right: Playback 55709 [15%] [on]
# F5
Front Right: Playback 55709 [20%] [on]
Run Code Online (Sandbox Code Playgroud)

现在我听说音量没有变化,百分比似乎与当前状态无关.当它真的仍然是70%时,它说10% - 15% - 20%.

我的apache以我的用户身份运行,因此exec('whoami')我在shell上登录了用户名,一切正常.

# httpd.conf
User mkt
Group mkt
Run Code Online (Sandbox Code Playgroud)

我在Fedora 22上.

可能是由于apache2进程环境.任何想法如何解决这一问题?

更新:

这是aplay -L的输出:

[mkt@localhost ~]$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default
    Default ALSA Output (currently PulseAudio Sound Server)
sysdefault:CARD=Intel
    HDA Intel, ALC888 Analog
    Default Audio Device
front:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    Front speakers
surround21:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Intel,DEV=0
    HDA Intel, ALC888 Analog
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Intel,DEV=0
    HDA Intel, ALC888 Digital
    IEC958 (S/PDIF) Digital Audio Output
hdmi:CARD=NVidia,DEV=0
    HDA NVidia, HDMI 0
    HDMI Audio Output
hdmi:CARD=NVidia,DEV=1
    HDA NVidia, HDMI 1
    HDMI Audio Output
hdmi:CARD=NVidia,DEV=2
    HDA NVidia, HDMI 2
    HDMI Audio Output
hdmi:CARD=NVidia,DEV=3
    HDA NVidia, HDMI 3
    HDMI Audio Output
Run Code Online (Sandbox Code Playgroud)

在命令行上只有默认和脉冲工作:

amixer -D pulse set Master 5%+
amixer -D default set Master 5%+
Run Code Online (Sandbox Code Playgroud)

用PHP甚至那两个都不起作用.无论如何......我的声音来自我的显示器扬声器,它通过hdmi插入.所以我猜最后4台设备是我的候选人.但他们没有工作.

$ amixer -D hdmi:CARD=NVidia,DEV=0 set Master 5%+
$ amixer -D hdmi:CARD=NVidia,DEV=1 set Master 5%+
$ amixer -D hdmi:CARD=NVidia,DEV=2 set Master 5%+
$ amixer -D hdmi:CARD=NVidia,DEV=3 set Master 5%+
Run Code Online (Sandbox Code Playgroud)

在所有四种情况下它都说:(当然DEV = [0-3])

ALSA lib control.c:954:(snd_ctl_open_noupdate) Invalid CTL hdmi:CARD=NVidia,DEV=3
amixer: Mixer attach hdmi:CARD=NVidia,DEV=3 error: No such file or directory
Run Code Online (Sandbox Code Playgroud)

UPDATE

输出aplay -l:

$ aplay -l

**** List of Hardware-Devices (PLAYBACK) ****
Card 0: Intel [HDA Intel], Device 0: ALC888 Analog [ALC888 Analog]
  Sub-Devices: 1/1
  Sub-Device #0: subdevice #0
Card 0: Intel [HDA Intel], Device 1: ALC888 Digital [ALC888 Digital]
  Sub-Devices: 1/1
  Sub-Device #0: subdevice #0
Card 1: NVidia [HDA NVidia], Device 3: HDMI 0 [HDMI 0]
  Sub-Devices: 1/1
  Sub-Device #0: subdevice #0
Card 1: NVidia [HDA NVidia], Device 7: HDMI 1 [HDMI 1]
  Sub-Devices: 0/1
  Sub-Device #0: subdevice #0
Card 1: NVidia [HDA NVidia], Device 8: HDMI 2 [HDMI 2]
  Sub-Devices: 1/1
  Sub-Device #0: subdevice #0
Card 1: NVidia [HDA NVidia], Device 9: HDMI 3 [HDMI 3]
  Sub-Devices: 1/1
  Sub-Device #0: subdevice #0

$ amixer -c0 set Master 5%+
$ amixer -c1 set Master 5%+
Run Code Online (Sandbox Code Playgroud)

两者都不起作用!

解:

感谢您的帮助!答案虽然来自https://superuser.com/questions/1069981/set-volume-using-php-exec-and-amixer

putenv("PULSE_SERVER=/run/user/".getmyuid()."/pulse/native");
Run Code Online (Sandbox Code Playgroud)

Can*_*rop 2

尝试首先运行aplay -L,您应该得到如下输出:

pulse
    PulseAudio Sound Server
sysdefault:CARD=MID
    HDA Intel MID, ALC889 Analog
    Default Audio Device
front:CARD=MID,DEV=0
    HDA Intel MID, ALC889 Analog
    Front speakers
surround21:CARD=MID,DEV=0
    HDA Intel MID, ALC889 Analog
    2.1 Surround output to Front and Subwoofer speakers
...
Run Code Online (Sandbox Code Playgroud)

确定其中哪一个是您的设备,然后将amixer ...命令修改为amixer -D device ...,例如amixer -D surround21:CARD=MID,DEV=0 set Master 5%+

这可能有效。如果没有,请尝试aplay -l(小写)并获取卡号。然后,例如,如果卡号是1,请尝试amixer -c 1 set Master 5%+