我希望能够使用FFmpeg从我的C#程序中转换视频文件。我知道我可以调用一个shell命令,但是有更好的方法吗?
通过shell调用命令的问题是,我不确定你可以做进度条等事情......或者你可以吗?
如果没有办法,任何人都可以建议布局一些框架来执行shell命令的最佳方法。通过一根长长的绳子非常麻烦。
答案 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包装器,然后从应用程序调用包装器接口?