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

Node.js中检测客户端中断请求并终止FFmpeg转码进程的方法

解决客户端取消请求时终止FFmpeg转码进程的方案

要处理客户端取消请求后仍在运行的FFmpeg进程,核心是监听HTTP请求的取消事件,在事件触发时主动杀死FFmpeg子进程,并清理相关资源。具体操作如下:

关键步骤

  • 监听请求的aborted事件(客户端主动取消请求时触发)或响应的close事件(连接关闭时触发)
  • 在事件回调中调用ffmpegProcess.kill()终止FFmpeg进程
  • 清理相关资源(如移除token、断开数据管道)

修改后的代码

// Start the ffmpeg child process
const ffmpegProcess = cp.spawn(ffmpeg, [
  // Remove ffmpeg's console spamming
  '-loglevel', '8', '-hide_banner',
  // Redirect/Enable progress messages
  '-progress', 'pipe:3',
  // Set inputs
  '-i', 'pipe:4',
  '-i', 'pipe:5',
  // Map audio & video from streams
  '-map', '0:a',
  '-map', '1:v',
  // Keep encoding
  '-c:v', 'copy',
  // Define output file
  token + formato,
], {
  windowsHide: true,
  stdio: [
    /* Standard: stdin, stdout, stderr */
    'inherit', 'inherit', 'inherit',
    /* Custom: pipe:3, pipe:4, pipe:5 */
    'pipe', 'pipe', 'pipe', 'pipe'
  ],
});

ffmpegProcess.stdio[3].on('data', (err) => {
  console.log(res.status())
});

audio.pipe(ffmpegProcess.stdio[4]);
video.pipe(ffmpegProcess.stdio[5]);

// 监听客户端主动取消请求事件
req.on('aborted', () => {
  // 终止FFmpeg进程(未被杀死时执行)
  if (!ffmpegProcess.killed) {
    ffmpegProcess.kill('SIGTERM');
  }
  // 清理token资源
  delete inUseTokens[token];
  // 断开数据管道,停止向进程写入数据
  audio.unpipe(ffmpegProcess.stdio[4]);
  video.unpipe(ffmpegProcess.stdio[5]);
  console.log('请求已取消,FFmpeg进程已终止');
});

// 补充监听响应关闭事件,覆盖网络断开等场景
res.on('close', () => {
  if (!ffmpegProcess.killed && !res.headersSent) {
    ffmpegProcess.kill('SIGTERM');
    delete inUseTokens[token];
    audio.unpipe(ffmpegProcess.stdio[4]);
    video.unpipe(ffmpegProcess.stdio[5]);
  }
});

ffmpegProcess.stdio[6].on('error', (err) => {
  // Remover token do objeto
  delete inUseTokens[token];
  res.status(500).send(err.message);
});

ffmpegProcess.stdio[6].on('close', () => {
  console.log("convertido!")
  res.render('downloated', {formato: formato, title: titulo, token: token, thumbnail: thumbnail, seconds: seconds})
});

补充说明

  • SIGTERM是温和终止信号,FFmpeg会尝试清理后退出;如果需要强制终止,Windows下可改用SIGINT,其他系统用SIGKILL
  • 调用unpipe断开管道,能避免继续向已终止的进程写入数据,减少不必要的错误日志
  • 同时监听aborted和close事件,可以覆盖客户端主动取消、网络断开等多种连接终止场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:45:30