首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用php exec和amixer设置音量

使用php exec和amixer设置音量
EN

Stack Overflow用户
提问于 2016-04-26 14:03:37
回答 4查看 2.5K关注 0票数 15

我编写了一个小的php脚本来使用alsa控制本地机器的卷:

代码语言:javascript
复制
<?php
# for simplicity and testing it really just executes the command:
echo exec('amixer set Master 5%+') . " \n";

现在,当我在命令行上运行这个脚本时,它工作得很好:

代码语言:javascript
复制
$ 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的浏览器运行脚本时,它不起作用。

代码语言:javascript
复制
# 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上登录的用户名,在那里一切都很好。

代码语言:javascript
复制
# httpd.conf
User mkt
Group mkt

我在费多拉22号。

可能是由于apache2流程环境造成的。有什么办法解决这个问题吗?

更新

这是aplay -L的输出:

代码语言:javascript
复制
[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

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

代码语言:javascript
复制
amixer -D pulse set Master 5%+
amixer -D default set Master 5%+

使用PHP,即使这两种方法也不起作用。不管怎样..。我的声音来自我的显示器,扬声器,这是插入通过hdmi。所以我想最后四个设备是我的候选设备。但它们都不管用。

代码语言:javascript
复制
$ 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 )

代码语言:javascript
复制
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的输出:

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
putenv("PULSE_SERVER=/run/user/".getmyuid()."/pulse/native");
EN

回答 4

Stack Overflow用户

发布于 2016-05-02 03:11:36

也许amixer在从apache运行时没有寻址正确的DBUS。尝试通过从一个在运行DBUS_ADDRESS之前设置变量的shell脚本调用amixer来设置amixer环境变量。

dbus_amixer.sh

代码语言:javascript
复制
#! /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

代码语言:javascript
复制
<?php
echo exec('dbus_amixer.sh') . " \n";
票数 4
EN

Stack Overflow用户

发布于 2016-04-29 18:35:54

尝试首先运行aplay -L,然后得到如下所示的输出:

代码语言:javascript
复制
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%+

票数 2
EN

Stack Overflow用户

发布于 2016-05-01 11:38:37

您说您的Apache用户以命令行用户的身份运行。相似的程度有多大?我注意到您使用的是短路径:

代码语言:javascript
复制
echo exec('amixer set Master 5%+')

如果...given的用户是相同的,您可能在Apache中使用了错误的路径(路径设置不依赖于用户,它们在用户配置文件中,并且Apache可能加载完全不同的配置文件)--尝试将amixer的完整路径放置到exec中:

代码语言:javascript
复制
echo exec('/usr/local/bin/or/whatever/amixer set Master 5%+') . " \n";

此外,为了调试目的,请运行shell_exec the 2>&1 stderr重定向到命令行。这可能会给出一些线索,说明到底是什么失败了。

您可以运行一个更复杂的命令来设置环境:

代码语言:javascript
复制
exec(`HOME=whatever FLAGS=somethingelse PATH=/usr/local/... /usr/local/bin/amixer... 2>&1`);

要知道环境变量是什么,您可以作为用户登录,验证amixer是否工作,将环境转储到文件中:

set > set.txt

并检查set.txt的任何值,可以适用于胺虫。您可以在Apache内部运行另一个类似的set,并比较结果(实际上,我认为环境也可以通过phpinfo()访问)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36867273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档