簡體   English   中英

如何殺死node.js中的ffmpeg進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM