我编写了一个小的php脚本来使用alsa控制本地机器的卷:
<?php
# for simplicity and testing it really just executes the command:
echo exec('amixer set Master 5%+') . " \n";现在,当我在命令行上运行这个脚本时,它工作得很好:
$ 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]我有音乐在演奏,我听到声音越来越大。
但是,当我尝试通过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]现在我听说数量没有变化,而且百分比似乎与目前的状况无关。它说,10% - 15% - 20%,而它实际上仍然在70%。
我的apache是以我的用户身份运行的,所以exec('whoami')给了我我在shell上登录的用户名,在那里一切都很好。
# httpd.conf
User mkt
Group mkt我在费多拉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在命令行上,只有默认和脉冲才能工作:
amixer -D pulse set Master 5%+
amixer -D default set Master 5%+使用PHP,即使这两种方法也不起作用。不管怎样..。我的声音来自我的显示器,扬声器,这是插入通过hdmi。所以我想最后四个设备是我的候选设备。但它们都不管用。
$ 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%+在所有四种情况下,它都写着:(当然,使用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更新
播放-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%+两个人都没用!
解决方案:
谢谢你的帮助!不过,答案来自https://superuser.com/questions/1069981/set-volume-using-php-exec-and-amixer
putenv("PULSE_SERVER=/run/user/".getmyuid()."/pulse/native");发布于 2016-05-02 03:11:36
也许amixer在从apache运行时没有寻址正确的DBUS。尝试通过从一个在运行DBUS_ADDRESS之前设置变量的shell脚本调用amixer来设置amixer环境变量。
dbus_amixer.sh
#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
export $DBUS_ADDRESS
/usr/bin/amixer set Master 5%+
fi(从以特定用户身份从PHP运行命令行应用程序复制的代码)
amixer.php
<?php
echo exec('dbus_amixer.sh') . " \n";发布于 2016-04-29 18:35:54
尝试首先运行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
...确定其中哪个是您的设备,然后将您的amixer ...命令修改为amixer -D device ...,例如amixer -D surround21:CARD=MID,DEV=0 set Master 5%+。
这可能管用。如果没有,请尝试aplay -l (小写),并获得卡号。然后,例如,如果卡号为1,请尝试amixer -c 1 set Master 5%+。
发布于 2016-05-01 11:38:37
您说您的Apache用户以命令行用户的身份运行。相似的程度有多大?我注意到您使用的是短路径:
echo exec('amixer set Master 5%+')如果...given的用户是相同的,您可能在Apache中使用了错误的路径(路径设置不依赖于用户,它们在用户配置文件中,并且Apache可能加载完全不同的配置文件)--尝试将amixer的完整路径放置到exec中:
echo exec('/usr/local/bin/or/whatever/amixer set Master 5%+') . " \n";此外,为了调试目的,请运行shell_exec the 2>&1 stderr重定向到命令行。这可能会给出一些线索,说明到底是什么失败了。
您可以运行一个更复杂的命令来设置环境:
exec(`HOME=whatever FLAGS=somethingelse PATH=/usr/local/... /usr/local/bin/amixer... 2>&1`);要知道环境变量是什么,您可以作为用户登录,验证amixer是否工作,将环境转储到文件中:
set > set.txt
并检查set.txt的任何值,可以适用于胺虫。您可以在Apache内部运行另一个类似的set,并比较结果(实际上,我认为环境也可以通过phpinfo()访问)。
https://stackoverflow.com/questions/36867273
复制相似问题