在c#中的ffmpeg中杀死进程



我使用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?

前导的"/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();应该工作。

所以我在硒Nunit测试中也遇到了启动和停止ffmpeg进程的同样麻烦。经过一番努力,我终于找到了一个简单的解决方案。以";q〃;对ffmpeg的处理窗口的输入优雅地停止了处理,并且视频记录也没有被破坏。以下是我的c#代码,用于启动ffmpeg并在执行后停止它。

  1. 创建一个bat文件来启动ffmpeg(您将从c#代码中调用这个bat文件(
  2. 在硒测试中,创建一个录制类和2个方法来启动和停止录制(在我的情况下,我在所有测试之前启动bat文件,就像在onetimesetup属性中调用executeScreenRecordingBatFile方法来启动录制和在onetimeteardown中调用StopScreenRecording方法一样(下面的示例代码
using System.Diagnostics;
using System.IO;
namespace FunctionalTests
{
    public class Recording
    {        
        public static Process process;
        public static void executeScreenRecordingBatFile()
        {
            try
            {
                process = new Process();
                process.StartInfo.FileName = @"C:Program Files (x86)StartScreenRecording.bat";
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardInput = true;// this required to send input to the current process window.
                bool started =  process.Start();
                if (started==true) 
                {
                    Console.WriteLine("Bat file started");                                                       
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace.ToString());
                throw;
            }
        }
        public static void StopScreenRecording() 
        {
            StreamWriter myStreamWriter = process.StandardInput; // this required to send StandardInput stream, nothing fancy 
            myStreamWriter.WriteLine("q"); //this will send q as an input to the ffmpeg process window making it stop , please cross check in task manager once if the ffmpeg is still running or closed.
        } 
    }
}

我创建了一个方法来杀死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标志确定整个流程树将被杀死。

干杯

相关内容

  • 没有找到相关文章

最新更新