2016-06-26 225 views
0

我使用Process类中的ffmpeg来执行这样的命令:杀死进程

string command = "/C ffmpeg -re -i test.mp4 -f mpegts udp://127.0.0.1:" + port.Text; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
process.StartInfo.Arguments = command; 
process.Start(); 

此码流视频到网络,但我想停止流当我点击按钮

我用process.kill(),但即使我关闭应用程序仍然流的过程

我怎样才能停止后台进程或发送CTRL + C到它?

回答

1

领先 “/ C” 表示你的cmd.exe通过启动呢? 在这种情况下,进程对应于cmd,然后启动ffmpeg。因此杀死cmd不会杀死ffmpeg。

string command = "-re -i test.mp4 -f mpegts udp://127.0.0.1:" + port.Text; 
process.StartInfo.FileName ="ffmpeg"; 
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
process.StartInfo.Arguments = command; 
process.Start(); 

process.Kill();应该工作。

0

我创建了一个杀死ffmpeg进程的方法。

private void KillAllFFMPEG() 
 
{ 
 
    Process killFfmpeg = new Process(); 
 
    ProcessStartInfo taskkillStartInfo = new ProcessStartInfo 
 
    { 
 
    FileName = "taskkill", 
 
     Arguments = "/F /IM ffmpeg.exe", 
 
     UseShellExecute = false, 
 
     CreateNoWindow = true 
 
    }; 
 

 
    killFfmpeg.StartInfo = taskkillStartInfo; 
 
    killFfmpeg.Start(); 
 
}

,无论你想叫它。

更新1

为了杀死只有一个FFmpeg的过程的情况下,我们需要得到它的PID第一。当您定义您的ffmpeg流程时,请在全局范围内定义它,并在初始化后使用以下命令获取PID。

int myProcessId = FfmpegProcess.Id;

然后调用下面

private void KillFFMPEGByPID(int PID) 
 
{ 
 
    Process killFfmpeg = new Process(); 
 
    ProcessStartInfo taskkillStartInfo = new ProcessStartInfo 
 
    { 
 
    FileName = "taskkill", 
 
     Arguments = "/PID " + Convert.ToString(PID) + " /T", 
 
     UseShellExecute = false, 
 
     CreateNoWindow = true 
 
    }; 
 

 
    killFfmpeg.StartInfo = taskkillStartInfo; 
 
    killFfmpeg.Start(); 
 
}

这会杀了只用给定PID的进程。/T标志在参数结尾处确定整个进程树将被终止。

干杯

+0

它的工作原理谢谢,但我怎么能修改它来通过ID杀死一个进程? –

+0

注意:这将杀死任何ffmpeg.exe,不仅仅是由你开始的那些。以防万一您同时运行其他工具。 – lexx9999

+0

刚刚更新了我的答案... –