2015-11-13 3 views
0

В приложении Windows C# я пытаюсь вызвать «ffmpeg» для мультиплексирования видео и аудио. Его можно назвать несколько раз. В первом вызове все нормально, но в следующем вызове у меня есть некоторые проблемы. Одна из проблем заключается в том, что предыдущий процесс «ffmpeg» не закрыт. Итак, я пытался убить его, если он существует. но теперь я получил сообщение об ошибке для отчуждаемого объекта в следующем коде:Запуск «FFMPEG» несколько раз в winfoms

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(); 
       } 
      } 
     } 
    } 

я ObjectDisposedException для ErrorDataRecieved события на errorWaitHandle.Set();

Во-первых, я хочу, чтобы устранить эту ошибку, но если вы знаете какие-либо лучшее решение для запуска «ffmpeg» несколько раз, пожалуйста, предложите мне.

ответ

1

Проблема в том, что во второй раз «ffmpeg» должен перезаписать предыдущий сгенерированный видеофайл. Затем он задает вопрос и ждет, пока пользователь разрешит перезапись. Поскольку я использовал CreateNoWindow, пользователь не может ответить на это сообщение. Чтобы решить эту проблему, я использовал опцию -y, чтобы автоматически перезаписать любой предыдущий файл.

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

-y сделал трюк для меня !! –

Смежные вопросы