2016-07-20 3 views
0

Я изо всех сил пытаюсь получить длину/продолжительность видео с помощью FFMPEG. Ниже приведен код, который я получил от Google, но когда я запускаю метод, он возвращает пустую строку. Какие бы хитрости я не мог, но не успел. Может ли кто-нибудь, пожалуйста, направить меня, что здесь происходит не так?Получение длины видео с использованием ffmpeg/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 -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(); 
    } 
+0

Вы должны RedirectStandardOutput и прочитать весь вывод из FFMPEG. FFMPEG помещает там «много» текста. После запуска FFMPEG сначала WaitForExit, чтобы FFMPEG завершил работу. –

+0

Работает ли команда 'ffprobe', если вы запускаете ее вручную, не зашифрованную с помощью интерфейса командной строки? Это нужно попробовать, прежде чем приступать к скрипту. – LordNeckbeard

+0

Нет. Я не пробовал ffprobe с использованием интерфейса командной строки, но я попробовал несколько команд ffprobe, установив его в код выше, но каждый раз они возвращают пустую строку в качестве вывода, а печальной частью является то, что они должны возвращать только продолжительность видео, что точно Мне нужно. –

ответ

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(); 
    } 

выше метода вернет вам продолжительность в чче: мм: ss.fff TT формат, означает включение миллисекунд, но если вы хотите время в секундах, то из команды, пожалуйста, удалите -sexagesimal.