.net process ffmpeg interaction processstartinfo

InteractĂșa con ffmpeg desde un programa.NET?



process interaction (2)

Estoy intentando crear un contenedor .NET para la conversión de archivos multimedia usando ffmepg , esto es lo que he intentado:

static void Main(string[] args) { if (File.Exists("sample.mp3")) File.Delete("sample.mp3"); string result; using (Process p = new Process()) { p.StartInfo.FileName = "ffmpeg"; p.StartInfo.Arguments = "-i sample.wma sample.mp3"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.Start(); //result is assigned with an empty string! result = p.StandardOutput.ReadToEnd(); p.WaitForExit(); } }

Lo que realmente ocurre es que el contenido del programa ffmpeg se imprime en la aplicación de la Consola, pero la variable result es una cadena vacía. Quiero controlar el progreso de la conversión de forma interactiva, por lo que el usuario ni siquiera tiene que saber que estoy usando ffmpeg, pero aún sabe los detalles del progreso de la conversión y qué porcentaje, etc., está haciendo la aplicación.

Básicamente, también me gustaría tener un contenedor .NET para una función P / invocar a la conversión SOLAMENTE (no estoy interesado en una biblioteca externa completa, a menos que pueda extraer la función PI de ella).

¿Alguien con experiencia en ffmpeg & .NET?

Actualización Por favor vea mi pregunta adicional, cómo escribir una entrada en un proceso de ejecución de ffmpeg .



Aquí está la respuesta:

static void Main() { ExecuteAsync(); Console.WriteLine("Executing Async"); Console.Read(); } static Process process = null; static void ExecuteAsync() { if (File.Exists("sample.mp3")) try { File.Delete("sample.mp3"); } catch { return; } try { process = new Process(); ProcessStartInfo info = new ProcessStartInfo("ffmpeg.exe", "-i sample.wma sample.mp3"); info.CreateNoWindow = false; info.UseShellExecute = false; info.RedirectStandardError = true; info.RedirectStandardOutput = true; process.StartInfo = info; process.EnableRaisingEvents = true; process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); process.Exited += new EventHandler(process_Exited); process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); } catch { if (process != null) process.Dispose(); } } static int lineCount = 0; static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e) { Console.WriteLine("Input line: {0} ({1:m:s:fff})", lineCount++, DateTime.Now); Console.WriteLine(e.Data); Console.WriteLine(); } static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) { Console.WriteLine("Output Data Received."); } static void process_Exited(object sender, EventArgs e) { process.Dispose(); Console.WriteLine("Bye bye!"); }