Я использую ASP. NET Core и ffmpeg для записи живого видео потока. Когда страница получает запрос на получение, поток должен начать запись и сохранение в папку с помощью ffmpeg. Я хочу сделать так, чтобы при посещении конечной точки stop процесс ffmpeg был закрыт полностью.
К сожалению, я не могу отправить 'q' на стандартный ввод после выхода из метода Get. Использование taskkill требует использования / F, чтобы процесс ffmpeg (который не является окном) принудительно завершал работу и не сохранял видео должным образом, что приводило к повреждению файла.
Я попытался использовать Process.Kill()
, но это также привело к повреждению файла. Кроме того, я попытался Process.CloseMainWindow()
, который работал, но только когда процесс запускается как окно, и я не могу запустить процесс как окно на сервере, который я использую.
У меня есть включите код, который у меня есть, ниже, так что, надеюсь, кто-то может привести меня по правильному пути.
using System;
...
using Microsoft.Extensions.Logging;
namespace MyApp.Controllers
{
[Route("api/[controller]")]
[Authorize]
public class RecordingController : Controller
{
private readonly ApplicationDbContext _context;
private readonly ILogger<HomeController> _logger;
public RecordingController(ApplicationDbContext context, ILogger<HomeController> logger)
{
_context = context;
_logger = logger;
}
[HttpGet]
public async Task<ActionResult> Get()
{
// Define the os process
var processStartInfo = new ProcessStartInfo()
{
// ffmpeg arguments
Arguments = "-f mjpeg -i \"https://urlofstream.com/video.gci\" -r 5 \"wwwroot/video.mp4\"",
FileName = "ffmpeg.exe",
UseShellExecute = true
};
var p1 = Process.Start(processStartInfo);
// p1.StandardInput.WriteLineAsync("q"); <-- This works here but not in the Stop method
return Ok(p1.Id);
}
// GET: api/Recording/stop
[HttpGet("stop/{pid}")]
public ActionResult Stop(int pid)
{
Process processes = Process.GetProcessById(pid);
processes.StandardInput.WriteLineAsync("q"); // Does not work, is not able to redirect input
return Ok();
}
}
}