如何识别ffmpeg管道结束了?

时间:2018-06-13 14:10:25

标签: c# ffmpeg process

我正在执行一个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()"。

1 个答案:

答案 0 :(得分:0)

我现在使用命名管道并跟踪要处理的帧数。在处理完最后一帧后立即关闭命名管道。此解决方案可在没有IOExceptions的情况下生成正确的视频。