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

时间:2009-11-10 12:13:26

标签: c# ffmpeg

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

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

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

5 个答案:

答案 0 :(得分:35)

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

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

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

答案 1 :(得分:6)

FFmpeg for .NET上有一个wrapper库。

答案 2 :(得分:3)

几周前,当我在寻找问题的答案时,我已经找到了这篇文章。 我试图启动ffmpeg进程并将参数传递给它,但是完成所有操作都花了很长时间。此时,我使用Xabe.FFmpeg,因为它是开箱即用的,不必担心ffmpeg可执行文件,因为它具有下载最新版本的功能。

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();

here有可用的文档,显示了如何获取当前的转化百分比。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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