2016-07-20 20 views
0

Ich habe Schwierigkeiten, die Länge/Dauer eines Videos mit FFMPEG zu bekommen. Unten ist der Code, den ich von Google bekommen habe, aber wenn ich die Methode benutze, gibt sie einen leeren String zurück. Habe irgendwelche Verbesserungen vorgenommen, aber keinen Erfolg. Kann mir bitte jemand sagen, was hier schief läuft?Die Länge des Videos mit ffmpeg/ffprobe funktioniert nicht

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

Sie müssen RedirectStandardOutput und lesen Sie alle Ausgaben von FFMPEG. FFMPEG hat "viel" Text dort hingelegt. Nach dem Start von FFMPEG muss WaitForExit zuerst FFMPEG den Auftrag beenden lassen. –

+0

Funktioniert der Befehl 'ffprobe', wenn Sie ihn manuell ausführen, nicht über die Befehlszeilenschnittstelle? Dies sollte versucht werden, bevor Sie versuchen, es zu skripten. – LordNeckbeard

+0

Nein Ich habe ffprobe nicht mit der Befehlszeilenschnittstelle versucht, aber ich habe einige ffprobe-Befehle ausprobiert, indem ich sie in den obigen Code einfüge, aber jedes Mal geben sie leere Zeichenfolgen als Ausgabe zurück. Der traurige Teil ist, dass sie nur die Videodauer zurückgeben sollen Ich brauche. –

Antwort

1

Danke an alle, ich habe die Antwort bekommen.

Es scheint, dass ffprobe nicht die Ausgabe

proc.StandardError; 

aber mit

proc.StandardOutput; 

Above-Anweisung zurückgibt arbeitete mit ffmpeg in Ordnung, aber nicht mit ffprobe und unter Anweisung mit ffprobe arbeitet. Hier ist das Arbeitsbeispiel für den Fall, dass jemand es braucht.

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

Above Methode werden Sie Dauer in hh zurück: mm: tt ss.fff Format bedeutet einschließlich Millisekunden, aber wenn Sie in Sekunden, dann von der Kommandodauer möchten, dann nehmen Sie den -sexagesimal.