2011-09-04 8 views
5

Próbuję utworzyć otoki .NET do konwersji mediów plik używając ffmepg, oto co próbowałem:Wejdź w interakcję z ffmpeg z programu .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(); 
    } 
} 

Co właściwie się dzieje, jest treść programu ffmpeg jest drukowany do Aplikacja konsoli, ale zmienna result to pusty ciąg znaków. Chcę interaktywnie kontrolować postęp konwersji, aby użytkownik nie musiał nawet wiedzieć, że korzystam z ffmpeg, ale nadal zna szczegóły postępu konwersji i jaki procent itp. Aplikacja jest gotowa.

Zasadniczo byłbym również zadowolony z wrappera .NET dla P/Invoke do funkcji konwersji TYLKO (nie jestem zainteresowany całą biblioteką zewnętrzną, chyba że mogę wyodrębnić z niej funkcję PI).

Ktoś z doświadczeniem w ffmpeg & .NET?

Aktualizacja Proszę zobaczyć moje kolejne pytanie, how to write input to a running ffmpeg process.

Odpowiedz

4

Oto odpowiedź:

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

The StringBuilder sb nie jest używany. –

+0

@aaaa bbbb: Usunięto, dziękuję. Pozostało to z wcześniejszych prób, w każdym razie dodałem kilka ważnych funkcji do mojej odpowiedzi. ** Czy możesz rzucić okiem na [this] (http://stackoverflow.com/questions/7296901) **? – Shimmy

0

Spróbuj użyć .

+0

wolę nie przy użyciu innych narzędzi zewnętrznych. Chciałbym usłyszeć o tym, jak utworzyć podstawowe proste P/Invokes tylko do wsparcia konwersji. Czy istnieje sposób na wywołanie takiego programu przy użyciu procesu w tle, jak w moim przykładzie? Czego mi brakuje? – Shimmy

+0

Sprawdź http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd możesz ukryć okno, ale jestem pewien, że możesz odczytać wynik to wciąż. –

+0

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

Powiązane problemy