我正在执行一个ffmpeg命令,它带有一个非常复杂的过滤器和一个C#应用程序中的管道。我将图像放入ffmpeg输入流(管道),以将此图像渲染为最终视频的叠加层。
我想用管道渲染图像,直到管道关闭。不幸的是,我不知道如何识别ffmpeg进程的管道已经关闭。是否有可能在C#中识别此事件?
过程开始如下:
this._ffmpegProcess = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = this._ffmpegPath,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
}
};
this._ffmpegProcess.StartInfo.Arguments = ffmpegCmd;
this._ffmpegProcess.OutputDataReceived += this.Proc_DataReceived;
this._ffmpegProcess.ErrorDataReceived += this.Proc_DataReceived;
this._ffmpegProcess.Exited += this._ffmpegProcess_Exited;
this._ffmpegProcess.Start();
this._ffmpegProcess.BeginOutputReadLine();
this._ffmpegProcess.BeginErrorReadLine();
渲染发生在计时器中:
this._renderOverlayTimer = new Timer(this.RenderOverlay);
this._renderOverlayTimer.Change(0, 30);
计时器在启动ffmpeg进程后立即启动:
private void RenderOverlay(object state)
{
using (var ms = new MemoryStream())
{
using (var img = GetImage(...))
{
img.Save(ms, ImageFormat.Png);
ms.WriteTo(this._ffmpegProcess.StandardInput.BaseStream);
}
}
}
问题是我总是收到一个"管道已经结束了#34;错误在" ms.WriteTo()"。
答案 0 :(得分:0)
我现在使用命名管道并跟踪要处理的帧数。在处理完最后一帧后立即关闭命名管道。此解决方案可在没有IOExceptions的情况下生成正确的视频。