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
相关产品推荐
相关产品推荐

