我使用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并在执行后停止它。
- 创建一个bat文件来启动ffmpeg(您将从c#代码中调用这个bat文件(
- 在硒测试中,创建一个录制类和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标志确定整个流程树将被杀死。
干杯