2011-09-04 25 views
5

Tôi đang cố gắng để tạo ra một wrapper NET cho chuyển đổi phương tiện truyền thông tập tin sử dụng ffmepg, đây là những gì tôi đã cố gắng:Tương tác với ffmpeg từ chương trình .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(); 
    } 
} 

Điều gì thực sự xảy ra là nội dung của chương trình ffmpeg được in ra với Ứng dụng Console, nhưng biến số result là một chuỗi trống. Tôi muốn kiểm soát quá trình chuyển đổi tương tác, vì vậy người dùng thậm chí không biết tôi đang sử dụng ffmpeg, nhưng anh ấy vẫn biết chi tiết về tiến độ chuyển đổi và tỷ lệ phần trăm, v.v. ứng dụng là tối đa. Về cơ bản tôi cũng sẽ hài lòng với trình bao bọc .NET cho hàm P/Invoke to conversion ONLY (Tôi không quan tâm đến toàn bộ thư viện bên ngoài, trừ khi tôi có thể trích xuất hàm PI từ nó).

Bất kỳ ai có kinh nghiệm trong ffmpeg & .NET?

Cập nhật Vui lòng xem câu hỏi tiếp theo của tôi, how to write input to a running ffmpeg process.

Trả lời

4

Dưới đây là câu trả lời:

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

Chuỗi sb StringBuilder không được sử dụng. –

+0

@aaaa bbbb: Đã xóa, cảm ơn. Nó vẫn còn từ những nỗ lực trước đó, dù sao tôi đã thêm một số chức năng quan trọng cho câu trả lời của tôi. ** Bạn có thể xem [this] (http://stackoverflow.com/questions/7296901) ** không? – Shimmy

0

Thử sử dụng ffmpeg-sharp.

+0

tôi không thích sử dụng các công cụ bên ngoài khác. Tôi rất thích nghe về cách tạo một số P/Invokes đơn giản cơ bản chỉ để hỗ trợ chuyển đổi. Có cách nào để insteract với một chương trình như vậy bằng cách sử dụng một quá trình nền như trong ví dụ của tôi? Tôi đang bỏ lỡ điều gì? – Shimmy

+0

Xem http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ea8b0fd5-a660-46f9-9dcb-d525cc22dcbd bạn có thể ẩn cửa sổ nhưng tôi chắc chắn bạn có thể đọc kết quả của nó vẫn còn. –

+0

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

Các vấn đề liên quan