Interact with ffmpeg from a .NET program - Write Input

前端 未结 2 598
日久生厌
日久生厌 2021-01-16 05:35

In reference to this question, as you can see I managed to run and receive data from the program.

However I didn\'t manage to submit data to it, for instance, while

相关标签:
2条回答
  • 2021-01-16 05:47

    Use WriteLine('q'); instead of Write('q');.

    :)

    I tried to run ffmpeg from cygwin bash shell and saw that I had to type an enter after 'q'. So....

        static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine("Error line: {0} ({1:m:s:fff})", lineCount++,
                DateTime.Now);
            Console.WriteLine(e.Data);
            Console.WriteLine();
            if (lineCount == 5)
                process.StandardInput.WriteLine("q");
        }
    

    With the stock c:\Documents and Settings\All Users\Documents\My Music\Sample Music\Beethoven's Symphony No. 9 (Scherzo).wma

    • without the process.StandardInput.WriteLine it prints 61 lines on stderr, 1 line on stdout and creates mp3 file of 1212457 bytes.
    • add the quit and it prints less number of lines on stderr, nothing on stdout and a much smaller mp3 file.

    Note that it does leave the mp3 file around.

    So there.

    EDIT

    After seeing your comment that you already tried this..

    I just rechecked. The behavior is strange.

    First I retried what I had and saw that sending "q\n" on the 5th line to sterr creates a much smaller file, though slightly different sizes in different runs -- between 160K and 220K.

    Next I commented out Console.WriteLine hoping it will make ffmpeg quit faster. On the contrary, ffmpeg now did not stop at all and created the full file with exact same byte count, 1,212,457 bytes. This behavior is consistent with your observation

    Finally, with WriteLines in place, I pumped "q\n" on every line to stderr after the fifth. Big surprise! After logging 40 error lines,

    Unhandled Exception: System.InvalidOperationException: StandardIn has not been redirected.
       at System.Diagnostics.Process.get_StandardInput()
       at StandAlone.Program.process_ErrorDataReceived(Object sender, DataReceivedEventArgs e) in C:\[..]\StandAlone\Program.cs:line 171
       at System.Diagnostics.Process.ErrorReadNotifyUser(String data)
    

    Not redirected? And you are telling me after I sent 35 lines to its input?

    Something is not quite right...smells like a bug.

    Update by asker:

    Updating the windows builds from here (static) solved my issue, I used some builds from an unofficial website apparently.

    0 讨论(0)
  • 2021-01-16 06:03

    I succeeded, I'm using global variables like with the process in my code:

    private void RunProcessAsync(string FfmpegPath, string Parameters)
    {
      //Create process info
      ProcessStartInfo oInfo = new ProcessStartInfo(FfmpegPath, Parameters);
      //Set process properties
      oInfo.UseShellExecute = false;
      oInfo.CreateNoWindow = true;
      oInfo.RedirectStandardOutput = false;
      oInfo.RedirectStandardError = true;
      oInfo.RedirectStandardInput = true;
    
      process.StartInfo = oInfo;
    
      process.EnableRaisingEvents = true;
      process.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
      process.Exited += new EventHandler(proc_Exited);
    
      process.Start();
      // this.pid = proc.Id;          
      process.BeginErrorReadLine();
    }
    
    public void stopProcess()
    {
      process.StandardInput.WriteLine("q");
    }
    
    0 讨论(0)
提交回复
热议问题