我希望能够使用FFmpeg从我的C#程序中转换视频文件.我知道我可以调用一个shell命令,但是有更好的方法吗?
通过shell调用命令的问题是,我不确定你可以做进度条等事情......或者你可以吗?
如果没有办法,任何人都可以建议布局一些框架来执行shell命令的最佳方法.传递一根长长的绳子非常麻烦.
Gon*_*alo 36
如果运行ffmpeg,您可以轻松实现进度条.运行时ffmpeg的输出类似于:
frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s
Run Code Online (Sandbox Code Playgroud)
它刷新〜每秒两次.您可以解析该行并获取显示进度所需的数据.当您在命令行中运行时,您只看到一行一直在更新,但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 ();
}
}
Run Code Online (Sandbox Code Playgroud)