[英]How to Kill ffmpeg process in node.js
我正在使用 node.js 代碼,使用 FFMPEG 將 Axis Ipcamera live stream 轉換為 mp4
var childProcess=require('child_process');
var childArguments = [];
var child=[];
var cmd='ffmpeg -i rtsp://172.24.22.117:554/axis-media/media.amp -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -preset slower -crf 18 -vf "scale=trunc(in_w/2)*2:trunc(in_h/2)*2"'+' '+__dirname+'/uploads/ouput.mp4';
child=childProcess.exec(
cmd,
childArguments,
{
env: process.env,
silent:true
}, function (err, stdout, stderr) {
if (err) {
throw err;
}
console.log(stdout);
});
// here generate events for listen child process (works properly)
// Listen for incoming(stdout) data
child.stdout.on('data', function (data) {
console.log("Got data from child: " + data);
});
// Listen for any errors:
child.stderr.on('data', function (data) {
console.log('There was an error: ' + data);
});
// Listen for exit event
child.on('exit', function(code) {
console.log('Child process exited with exit code ' + code);
child.stdout.pause();
child.kill();
});
我上面的代碼完美運行。 它根據需要提供 output,但我無法終止(停止)ffmpeg 命令。 我正在使用下面的代碼停止進程,但在后台它仍然繼續。
child.kill("SIGTERM");
我還使用了以下命令:child.kill('SIGUSR1'); child.kill("SIGHUP"); child.kill("SIGINT");child.kill('SIGUSR2'); 殺死這個過程,但它不起作用。
目前我強行殺死節點應用程序以停止 ffmpeg 命令並生成 mp4 文件。 我不想這樣。 但我想要停止 ffmpeg 進程並生成 mp4 文件的命令,而不終止節點應用程序。
var cp = require('child_process');
var cmd = 'ffmpeg...'
var child = cp.exec(cmd, function(err, stdout, stderr) {})
child.stdin.write('q')
這最終成為我的解決方案:
child.stdin.end()
它可以很好地跨平台工作。 在我的具體案例中,FFmpeg 也從 STDIN 讀取 stream 數據。 SIGTERM
沒有工作。 Windows 能夠用SIGTERM
終止,但這只是因為它實際上並沒有使用這些信號,而是強行終止了進程。
所以,您可以嘗試結束STDIN
,看看是否也能解決您的使用問題!
您正在從child.on('exit')
回調中調用child.kill()
,這可能是問題所在,因為未觸發該回調。 child.on('exit')
實際上在子進程完成時被調用。
同樣,如果您需要明確殺死子進程,則意味着該命令本身不會退出。 如果是這樣的話,也許您想設置一個超時時間以在運行一段時間后調用child.kill()
。
在 stdin 中發送 'q' 是一個很好的解決方案,但我發現它有點不穩定,因為它並非每次都有效。 所以這就是我所發現的。
剩余的進程不是直接從您的 NodeJS 主進程生成的。 換句話說,它們是您生成的進程的孩子。 我在exec
打開 shell 和 shell 分叉 ffmpeg 進程的情況下看到了這個問題。
目前在child_process中沒有殺死整個進程樹的方法,但是這里有一個功能請求。
另一種解決方案是使用模塊tree-kill 。 這是我從他們的Github 頁面偷偷摸摸的一個例子:
殺死 pid 為 1 的進程的所有后代進程,包括 pid 為 1 的進程本身:
var kill = require('tree-kill');
kill(1);
所以如果你想殺死進程樹:
var treekill = require('tree-kill');
treekill(child.pid);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.