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

Windows下PHP用popen/proc_open启动ffmpeg并获取PID终止进程问询

Windows环境PHP通过proc_open管理ffmpeg进程实现方案

原有title设置不生效的原因

你之前在popen中写入的title $title \r start ...逻辑仅作用于popen临时创建的cmd进程,而start /min会触发Windows新开独立的cmd窗口运行ffmpeg,两个进程完全独立,所以title设置不会同步到新窗口,也无法通过这个标题关联到实际运行的ffmpeg进程。

步骤1:启动ffmpeg并获取PID存储

使用proc_open启动进程后可以通过proc_get_status拿到进程PID,将PID和对应标题绑定存储到数据库、SESSION或缓存中即可用于后续管理。注意要把start /min替换为start /B避免新开独立进程,导致PID获取错误。

// 对用户输入做转义,避免命令注入风险
$title = $_POST['title'];
$ip = escapeshellarg($_POST['IPtxt']);
$UIP = escapeshellarg($_POST['UDPAddress']);
$UPort = escapeshellarg($_POST['UDPPort']);

// 构造ffmpeg命令,/B参数表示后台运行不弹出窗口
$ffmpegCommand = "start /B ffmpeg -loglevel quiet -re -i udp://{$UIP}:{$UPort} -codec: copy -f mpegts udp://{$ip}?pkt_size=1316";

// 配置proc_open的IO描述符
$descriptorspec = [
    0 => ["pipe", "r"], // 标准输入
    1 => ["pipe", "w"], // 标准输出
    2 => ["pipe", "w"]  // 标准错误
];

// 启动进程
$process = proc_open($ffmpegCommand, $descriptorspec, $pipes);

if (is_resource($process)) {
    // 获取进程状态,拿到PID
    $procInfo = proc_get_status($process);
    $ffmpegPid = $procInfo['pid'];
    
    // 将标题与PID绑定存储,示例存SESSION,多用户场景建议存数据库绑定用户ID
    session_start();
    if (!isset($_SESSION['ffmpeg_processes'])) {
        $_SESSION['ffmpeg_processes'] = [];
    }
    $_SESSION['ffmpeg_processes'][$title] = $ffmpegPid;
    
    // 关闭管道避免PHP执行阻塞
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    
    echo "ffmpeg启动成功,对应PID:{$ffmpegPid}";
} else {
    echo "进程启动失败";
}

步骤2:停止对应ffmpeg进程

收到停止请求时,根据传入的标题取出对应PID,调用Windows的taskkill命令强制关闭进程即可,/T参数会连带关闭所有子进程避免ffmpeg残留。

session_start();
$stopTitle = $_POST['stop_title']; // 停止按钮传过来的对应进程标题

if (isset($_SESSION['ffmpeg_processes'][$stopTitle])) {
    $targetPid = $_SESSION['ffmpeg_processes'][$stopTitle];
    // 执行强制杀进程命令
    exec("taskkill /F /T /PID ".escapeshellarg($targetPid));
    // 删除存储的进程记录
    unset($_SESSION['ffmpeg_processes'][$stopTitle]);
    echo "对应进程已停止";
} else {
    echo "未找到匹配的运行进程";
}

注意事项

  • 不要使用start /min参数,会触发新开独立窗口导致拿到的PID是临时cmd进程的ID,无法关联到实际ffmpeg进程
  • 所有传入命令的用户参数必须做转义处理,避免命令注入漏洞
  • 业务场景如果是多用户使用,不要仅用SESSION存储PID,建议将PID、标题、用户ID绑定存储到数据库中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:04