【问题标题】:C# and FFmpeg preferably without shell commands?C# 和 FFmpeg 最好没有 shell 命令?
【发布时间】:2010-12-15 00:25:39
【问题描述】:

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

通过 shell 调用命令的问题是,我不确定您是否可以执行诸如进度条之类的操作……或者您可以吗?

如果没有办法,任何人都可以建议最好的方法来布局一些框架以执行 shell 命令。传递一个大长字符串是非常麻烦的atm。

【问题讨论】:

  • 有人吗?来吧,一定有人在 .net 中使用过 ffmpeg

标签: c# ffmpeg


【解决方案1】:

如果运行 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 ();
        }
}

【讨论】:

  • 啊...我一直在尝试重定向到标准输出...不是错误。它突然起作用了:P
  • +1:我在 Java 中做过同样的事情,对结果非常非常满意。但是有一些问题:像time 值,可以是第一次更新的进度行输出的 100000000 int 之类的东西。我的直觉说这是一个内部初始化值。
  • 可能是的。只需使用谓词语句来消除高于某个合理范围的值。脏,但它会工作
【解决方案2】:

在 .NET 的 FFmpeg 上有一个 wrapper 库。

【讨论】:

  • "目前音频解码和编码已经成熟,视频功能正在开发中(我们目前有视频解码工作,但还没有同步音频)。"我需要音频正常工作。
  • 不幸的是,该项目自 +2 年前的上述 cmets 以来一直没有更新。并且没有二进制分布;你必须检查代码并自己构建它。
【解决方案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 显示如何获取当前的转化百分比。

【讨论】:

    【解决方案4】:

    我刚刚在 sourceforge 找到了fflib。看起来很有前途,不过还没用过。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • VC 编译器不支持 ffmpeg 中使用的许多 C 语言结构。 ffmpeg 团队有兴趣看到有人成功将代码移植到 VC。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2013-08-11
      • 2011-11-06
      • 2010-10-17
      相关资源
      最近更新 更多