使用ffmpeg / ffprobe获取视频长度无效

时间:2016-07-20 07:10:30

标签: c# ffmpeg ffprobe

我正在努力使用FFMPEG获取视频的长度/持续时间。下面是我从Google获得的代码,但是当我运行该方法时,它返回空字符串。我做了什么调整但没有成功。有人可以指导我这里出了什么问题吗?

 private static void GetVideoDuration()
    {
        string basePath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar;
        string filePath = basePath + @"1.mp4";            
        string cmd = string.Format("-v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1  {0}", filePath);
        Process proc = new Process();
        proc.StartInfo.FileName = Path.Combine(basePath, @"ffprobe.exe");
        proc.StartInfo.Arguments = cmd;
        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.ReadToEnd()) != null)
        {
            Console.WriteLine(line);
        }
        proc.Close();
    }

1 个答案:

答案 0 :(得分:1)

谢谢大家,我得到了答案。

似乎ffprobe没有使用

返回输出
proc.StandardError;

但使用

proc.StandardOutput;

上述声明与ffmpeg一起运行良好,但ffprobe没有,而且下面的声明正在使用ffprobe。 如果有人需要,这是一个工作示例。

   private static void GetVideoDuration()
    {
        string basePath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar;
        string filePath = basePath + @"1.mp4";
        string cmd = string.Format("-v error -select_streams v:0 -show_entries stream=duration -sexagesimal -of default=noprint_wrappers=1:nokey=1  {0}", filePath);
        Process proc = new Process();
        proc.StartInfo.FileName = Path.Combine(basePath, @"ffprobe.exe");
        proc.StartInfo.Arguments = cmd;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardError = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.UseShellExecute = false;
        if (!proc.Start())
        {
            Console.WriteLine("Error starting");
            return;
        }
        string duration = proc.StandardOutput.ReadToEnd().Replace("\r\n", "");
        // Remove the milliseconds
        duration = duration.Substring(0, duration.LastIndexOf("."));
        proc.WaitForExit();
        proc.Close();
    }

上面的方法将以 hh:mm:ss.fff tt 格式返回持续时间,表示包括毫秒,但如果您想要持续时间(以秒为单位),那么请从命令中删除 -sexagesimal < / em>的