正在运行“;FFMPEG”;在冬季的几次

本文关键字:几次 运行 FFMPEG 冬季 | 更新日期: 2023-09-27 18:21:42

在C#Windows应用程序中,我尝试调用"ffmpeg"来多路传输视频和音频。它可能被调用多次。在第一次通话中,一切都很好,但在下一次通话中我遇到了一些问题。一个问题是早期的"ffmpeg"进程没有关闭。所以,我试图杀死它,如果它存在的话。但现在我在下面的代码中得到了一个已处理对象的错误:

   public static void FFMPEG3(string exe_path, string avi_path, string mp3_path, string output_file)
    {
        const int timeout = 2000;
        Kill(exe_path);
        using (Process process = new Process())
        {
            process.StartInfo.FileName = exe_path;
            process.StartInfo.Arguments = string.Format(@"-i ""{0}"" -i ""{1}"" -acodec copy -vcodec copy ""{2}""",
                                           avi_path, mp3_path, output_file);
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            StringBuilder output = new StringBuilder();
            StringBuilder error = new StringBuilder();
            using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
            using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
            {
                process.OutputDataReceived += (sender, e) =>
                {
                    if (e.Data == null)
                    {
                        outputWaitHandle.Set();
                    }
                    else
                    {
                        output.AppendLine(e.Data);
                    }
                };
                process.ErrorDataReceived += (sender, e) =>
                {
                    if (e.Data == null)
                    {
                        errorWaitHandle.Set();
                    }
                    else
                    {
                        error.AppendLine(e.Data);
                    }
                };
                process.Start();
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
                if (process.WaitForExit(timeout) &&
                    outputWaitHandle.WaitOne(timeout) &&
                    errorWaitHandle.WaitOne(timeout))
                {
                    // Process completed. Check process.ExitCode here.
                    process.Close();
                }
                else
                {
                    // Timed out.
                    process.Close();
                }
            }
        }
    }

我在errorWaitHandle.Set(); 上获得ErrorDataRecieved事件的ObjectDisposedException

首先,我想解决这个错误,但如果你知道任何更好的解决方案来运行"ffmpeg"几次,请建议我。

正在运行“;FFMPEG”;在冬季的几次

问题是第二次,"ffmpeg"必须覆盖以前生成的视频文件。然后,它会询问一个问题,并等待用户允许覆盖。由于我使用了CreateNoWindow,用户无法回复此消息。为了解决这个问题,我使用了选项-y来自动覆盖以前的任何文件。

 process.StartInfo.Arguments 
  = string.Format(@"-i ""{0}"" -i ""{1}"" -y -acodec copy -vcodec copy ""{2}""",
                                               avi_path, mp3_path, output_file);