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 converting a file, pressing q
immediately stop conversion and stops the program.
I need my application to support stopping the process as well, and I think this should be done by passing this parameter to the ffmpeg app, since I want it to take care of all uncollected resource or whatever dust it would leave behind if I would just go and use process.Kill()
Here is what I've tried:
static int lineCount = 0;
static bool flag;
static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Error ({1:m:s:fff}: {0})", lineCount++,
DateTime.Now);
if (e.Data != null && string.Equals(e.Data,"Press [q] to stop, [?] for help"))
flag = true;
if (flag)
{
flag = false;
Console.WriteLine("Stopping ({0:m:s:fff})...", DateTime.Now);
process.CancelErrorRead();
process.CancelOutputRead();
process.StandardInput.WriteLine("q");
}
Console.WriteLine(e.Data);
Console.WriteLine();
}
But it doesn't do anything, seems that once the conversion has been requested, I have no control on it any more, I can only receive output from it. Running it as stand alone does allow me interaction of course.
What am I missing here, is it a different trick in submitting the output or the code in previous answer is wrong, or I should have chosen a different approach?
For your attention, RedirectStandardInput
is on.
NOTE: as you can see in the answer of my previous question, ffmpeg interacts differently, I think the one who knows the answer will be (maybe I'm wrong) someone with experience in ffmpeg.
I succeeded, I'm using global variables like with the process in my code:
Use
WriteLine('q');
instead ofWrite('q');
.:)
I tried to run ffmpeg from cygwin bash shell and saw that I had to type an enter after
'q'
. So....With the stock
c:\Documents and Settings\All Users\Documents\My Music\Sample Music\Beethoven's Symphony No. 9 (Scherzo).wma
process.StandardInput.WriteLine
it prints 61 lines on stderr, 1 line on stdout and creates mp3 file of 1212457 bytes.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 observationFinally, with
WriteLines
in place, I pumped"q\n"
on every line tostderr
after the fifth. Big surprise! After logging 40 error lines,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.