2011-09-04 13 views
5

estoy tratando de crear un contenedor .NET para la conversión de los medios de comunicación-archivo usando ffmepg, aquí es lo que he intentado:¿Interactuar con ffmpeg desde un programa .NET?

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 en realidad sucede es el contenido del programa ffmpeg se imprime a la Aplicación de 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 de P/invocación a 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, consulte mi pregunta adicional, how to write input to a running ffmpeg process.

Respuesta

4

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!"); 
} 
+0

StringBuilder sb no se utiliza. –

+0

@aaaa bbbb: Eliminado, gracias. Se mantuvo de intentos anteriores, de todos modos, agregué algunas funciones importantes a mi respuesta. ** ¿Podría echar un vistazo a [esto] (http://stackoverflow.com/questions/7296901) **? – Shimmy

0

Pruebe usar ffmpeg-sharp.

+0

yo no prefiero usar otras herramientas externas. Me encantaría saber cómo crear algunas P/invocaciones sencillas básicas solo para soporte de conversión. ¿Hay alguna manera de interactuar con dicho programa usando un proceso en segundo plano como en mi ejemplo? ¿Qué me estoy perdiendo? – Shimmy

+0

Consulte http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd puede ocultar la ventana, pero estoy seguro de que puede leer la salida de todavía. –

+0

http://stackoverflow.com/questions/7296901 – Shimmy

Cuestiones relacionadas