C#和FFmpeg最好没有shell命令?

我希望能够使用FFmpeg从我的C#程序中转换video文件。 我知道我可以调用一个shell命令, 但是有更好的方法吗?

通过shell调用命令的问题是,我不确定你可以做进度条等事情……或者你可以吗?

如果没有办法,任何人都可以建议布局一些框架来执行shell命令的最佳方法。 通过一根长长的绳子非常麻烦。

如果运行ffmpeg,您可以轻松实现进度条。 运行时ffmpeg的输出类似于:

frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s 

它刷新〜每秒两次。 您可以解析该行并获取显示进度所需的数据。 当您在命令行中运行时,您只看到一行一直在更新,但ffmpeg的作用是写入后跟\ r \ n的行。 这就是为什么你看不到多行。 但是,在程序的错误输出上使用StreamReader.ReadLine()时,每次更新都会得到一行。

下面是读取输出的示例代码。 您必须忽略任何不以’frame’开头的行,如果您想要读取异步行等,可能会使用BeginErrorReadLine() + ErrorDataReceived ,但是您明白了(我实际上已经测试过了):

 using System; using System.Diagnostics; using System.IO; class Test { static void Main (string [] args) { Process proc = new Process (); proc.StartInfo.FileName = "ffmpeg"; proc.StartInfo.Arguments = "-i " + args [0] + " " + args [1]; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.UseShellExecute = false; if (!proc.Start ()) { Console.WriteLine ("Error starting"); return; } StreamReader reader = proc.StandardError; string line; while ((line = reader.ReadLine ()) != null) { Console.WriteLine (line); } proc.Close (); } } 

FFmpeg for .NET上有一个包装库。

几个星期前,当我在寻找问题的答案时,我发现了这篇文章。 我试图启动ffmpeg进程并将参数传递给它,但是做一切都需要很长时间。 此时我使用Xabe.FFmpeg开箱即用,并且不必担心ffmpeg可执行文件,因为它具有下载最新版本的function。

 bool conversionResult = await new Conversion().SetInput(Resources.MkvWithAudio) .AddParameter(String.Format("-f image2pipe -i pipe:.bmp -maxrate {0}k -r {1} -an -y {2}",bitrate, fps, outputfilename)) .Start(); 

这里提供的文档显示了如何获得当前转换百分比。

如何围绕ffmpeg的本机接口编写C ++ / CLI包装器,然后从应用程序调用包装器接口?

我刚在sourceforge找到了fflib 。 看起来非常有希望,虽然没有使用它。