C#和FFmpeg最好没有shell命令?
我希望能够使用FFmpeg从我的C#程序中转换视频文件。我知道我可以调用shell命令,但是有更好的方法吗 通过shell调用命令的问题是,我不确定您是否可以执行进度条之类的操作。。。或者你可以吗C#和FFmpeg最好没有shell命令?,c#,ffmpeg,C#,Ffmpeg,我希望能够使用FFmpeg从我的C#程序中转换视频文件。我知道我可以调用shell命令,但是有更好的方法吗 通过shell调用命令的问题是,我不确定您是否可以执行进度条之类的操作。。。或者你可以吗 如果没有办法的话,有谁能建议最好的方法来布局一些框架来执行shell命令呢。传递一个大的长字符串非常麻烦。在FFmpeg for.NET上有一个库。围绕FFmpeg的本机接口编写一个C++/CLI包装器,然后从应用程序调用包装器接口如何?如果运行FFmpeg,您可以轻松实现一个进度条。运行时ffmpe
如果没有办法的话,有谁能建议最好的方法来布局一些框架来执行shell命令呢。传递一个大的长字符串非常麻烦。在FFmpeg for.NET上有一个库。围绕FFmpeg的本机接口编写一个C++/CLI包装器,然后从应用程序调用包装器接口如何?如果运行FFmpeg,您可以轻松实现一个进度条。运行时ffmpeg的输出类似于:
frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s
每秒刷新两次。您可以解析该行并获取显示进度所需的数据。当您在命令行中运行时,您只会看到一行一直在更新,但ffmpeg所做的是将该行写入后面的\r\n行。这就是为什么你看不到多行。但是,当对程序的错误输出使用StreamReader.ReadLine()时,每次更新都会得到一行
下面是读取输出的示例代码。您必须忽略任何不以“frame”开头的行,如果您希望读取的行是异步的,可以使用+等等,但您明白了这一点(我已经对其进行了实际测试):
我刚在sourceforge找到。看起来很有希望,但是我没有用过。我在几周前找到了这篇文章,当时我正在寻找问题的答案。 我试图启动ffmpeg进程并向其传递参数,但这一切都需要很长时间。在这一点上,我使用as-it来完成这项工作,不必担心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();
现有文档显示了如何获得当前的转换百分比。“目前音频解码和编码已经成熟,视频功能正在开发中(我们目前有视频解码功能,但还没有同步音频)。”我需要音频正常工作。不幸的是,自2年前的上述评论以来,该项目尚未更新。没有二元分布;你必须检查代码并自己构建。有人吗?拜托,一定有人用过ffmpeg和.netah。。。我一直在尝试重定向到standardOutput。。。不是错误。它突然起作用了:P+1:我用Java做了同样的事情,我对结果非常非常满意。不过也有一些捕获:比如
time
值,在第一次更新的进度线输出中可能是100000000。我的直觉说这是一个内部初始化值。可能是的。只需使用谓词语句来消除超出某个合理范围的值。脏,但它会工作的VC编译器不支持ffmpeg中使用的许多C语言结构。ffmpeg团队希望看到有人成功地将代码移植到VC。
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();