我使用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?
答案 0 :(得分:1)
前导“/ C”表示您是通过cmd.exe启动的吗? 在这种情况下,进程对应于cmd,而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();
应该适用。
答案 1 :(得分: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标志确定整个进程树将被终止。
干杯