2009-04-16 9 views
5

Ich versuche Code folgende Videoauflösung zu bestimmen, indem ffmpeg Nutzen als Subprozess läuft und dessen Ausgang zu gewinnen und analysieren es:Kann nicht ffmpeg als Subprozess in Ruby laufen

IO.popen 'ffmpeg -i ' + path_to_file do |ffmpegIO| 
    # my parse goes here 
end 

... aber ffmpeg Ausgang ist immer noch verbunden mit stdout und ffmepgIO.readlines ist leer. Ist für das Dienstprogramm ffmpeg eine spezielle Behandlung erforderlich? Oder gibt es eine andere Möglichkeit, die ffmpeg-Ausgabe zu erhalten? Ich habe diesen Code unter WinXP und Fedora Linux getestet - Ergebnisse sind gleich.

Antwort

7

Um auf mouviciel Kommentar des Follow-up, würden Sie so etwas wie popen3 verwenden müssen wäre ein bisschen sicherer, vor allem, wenn der Dateiname Leerzeichen oder andere Zeichen enthalten könnte, die anderswo zitiert werden müssten)

3

FFmpeg stdout ist für Medienausgabe. Zum Aufzeichnen von Informationen (z. B. Auflösung) müssen Sie ffmpeg stderr analysieren.

0

Je nachdem, was Sie versuchen zu tun, könnte es einfacher sein, die rvideo gem zu verwenden.

Zum Beispiel:

require 'open3' 

Open3.popen3("ffmpeg", "-i", path_to_file) { |stdin, stdout, stderr| 
    # do stuff 
} 

(btw, beachten Sie, dass ein Array als Parameter verwenden popen:

video = RVideo::Inspector.new(:file => path_to_file) 
video.resolution # => "480x272" 
video.width # => 480 
video.height # => 272 
+0

Ich bin bereits enttäuscht in RVideo gem becaus e es funktioniert nicht mit ffmpeg. Ich überprüfe den Quellcode dieses Edelsteins und begründe, dass es versucht, ffmpeg genau so auszuführen, wie ich es beschrieben habe und daher fehlschlägt. – Eskat0n