You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS下Shell运行PHP脚本实现音频播放与控制的可行性咨询

在macOS Shell中用PHP实现带控制功能的音频播放

当然可以实现!在macOS的Shell环境下,PHP完全能通过启动后台音频播放进程的方式,实现你要的音频播放+暂停/恢复/跳转等控制功能。下面是具体的实现思路和代码示例:

核心思路

我们可以借助mpv这个强大的命令行媒体播放器(它原生支持mp3、m4a/ALAC等格式,并且提供了完善的进程控制接口),PHP通过启动mpv后台进程,再通过信号或者IPC通信来实现各种控制操作。

前置依赖安装

首先需要安装mpv和socat(用于和mpv的IPC套接字通信),用Homebrew即可快速完成:

brew install mpv socat

完整PHP脚本示例

下面的脚本实现了基础的播放、暂停、恢复、前后跳转功能,并且可以通过用户中断(Ctrl+C)来安全清理进程:

<?php

// 替换为你的目标音频文件路径
$audioPath = '/Users/you/Music/your-audio.m4a';

// 定义mpv控制用的临时套接字路径
$socketPath = '/tmp/mpv-control-socket';

// 启动mpv后台进程,启用IPC套接字用于发送控制指令
$mpvCommand = "mpv --no-video --input-ipc-server=$socketPath '$audioPath' > /dev/null 2>&1 & echo $!";
$mpvPid = exec($mpvCommand);
echo "音频播放已启动,进程ID:$mpvPid\n";

// 暂停播放的封装函数
function pausePlayback() {
    global $socketPath;
    exec("echo '{\"command\": [\"set_property\", \"pause\", true]}' | socat - $socketPath");
    echo "已暂停播放\n";
}

// 恢复播放的封装函数
function resumePlayback() {
    global $socketPath;
    exec("echo '{\"command\": [\"set_property\", \"pause\", false]}' | socat - $socketPath");
    echo "已恢复播放\n";
}

// 向前跳转指定秒数
function jumpForward($seconds = 10) {
    global $socketPath;
    exec("echo '{\"command\": [\"seek\", $seconds, \"relative\"]}' | socat - $socketPath");
    echo "已向前跳转 $seconds 秒\n";
}

// 向后跳转指定秒数
function jumpBackward($seconds = 10) {
    global $socketPath;
    exec("echo '{\"command\": [\"seek\", -$seconds, \"relative\"]}' | socat - $socketPath");
    echo "已向后跳转 $seconds 秒\n";
}

// 处理用户中断信号(Ctrl+C),确保退出时清理进程和套接字
pcntl_signal(SIGINT, function() use ($mpvPid, $socketPath) {
    exec("kill $mpvPid");
    if (file_exists($socketPath)) {
        unlink($socketPath);
    }
    echo "\n播放已终止,资源已清理\n";
    exit(0);
});

// 模拟播放流程(可根据需求替换为自己的业务逻辑)
sleep(5);
pausePlayback();
sleep(3);
resumePlayback();
sleep(5);
jumpBackward(10);
sleep(10);

// 保持脚本运行,等待播放结束或用户中断
while (true) {
    pcntl_signal_dispatch();
    // 检查mpv进程是否仍在运行
    if (!posix_kill($mpvPid, 0)) {
        echo "音频播放已结束\n";
        unlink($socketPath);
        exit(0);
    }
    sleep(1);
}

关键功能说明

  1. 后台进程启动:通过exec执行mpv命令,将进程ID保存下来用于后续管理。--no-video确保只播放音频,--input-ipc-server创建套接字用于发送控制指令。
  2. 暂停/恢复的两种方式:
    • 推荐用IPC套接字发送JSON指令,精准控制播放状态;
    • 也可以直接用信号快速控制:
      // 用信号暂停
      posix_kill($mpvPid, SIGSTOP);
      // 用信号恢复
      posix_kill($mpvPid, SIGCONT);
      
  3. 跳转功能:借助mpv的seek命令实现相对时间跳转,正负值分别对应前进和后退。
  4. 进程安全清理:监听SIGINT信号,确保用户中断或脚本结束时,杀死mpv进程并删除临时套接字文件,避免资源残留。

极简替代方案(afplay)

如果你不想安装额外工具,macOS自带的afplay也能播放音频,但它不支持暂停/恢复和跳转功能,只能通过杀死进程终止播放,适合简单场景:

<?php
$audioPath = '/path/to/your-audio.mp3';
$pid = exec("afplay '$audioPath' > /dev/null 2>&1 & echo $!");
echo "播放中,进程ID:$pid\n";
// 终止播放可执行:posix_kill($pid, SIGTERM);

显然mpv的方案能完全满足你的控制需求,更推荐使用。

内容的提问来源于stack exchange,提问作者forthrin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:31:52