2009-04-16 17 views
5

sto cercando seguente codice per determinare la risoluzione video eseguendo utilità ffmpeg come sottoprocesso e di ottenere la sua uscita e analizzarlo:non possono eseguire ffmpeg come sottoprocesso in Ruby

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

... ma la produzione è ancora ffmpeg collegato a stdout e ffmepgIO.readlines è vuoto. C'è qualche trattamento speciale necessario per l'utility ffmpeg? O ci sono altri modi per ottenere l'output di ffmpeg? Ho testato questo codice sotto WinXP e Fedora Linux - i risultati sono gli stessi.

risposta

7

al follow-up sul commento di mouviciel, si avrebbe bisogno di usare qualcosa come popen3:

require 'open3' 

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

(btw, si noti che l'utilizzo di un array come parametro per popen sarebbe un po 'più sicuro, soprattutto se il nome del file potrebbe includere spazi o qualsiasi tipo di carattere che avrebbe bisogno di essere quotato in altro modo)

3

FFmpeg stdout è per l'uscita del supporto. Per informazioni sulla registrazione (come la risoluzione) è necessario analizzare ffmpeg stderr.

0

A seconda di cosa si sta tentando di fare, potrebbe essere più semplice utilizzare lo rvideo gem.

Ad esempio:

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

Sono già deluso da RVideo gemma becaus e non funziona con ffmpeg. Controllo il codice sorgente di questo gioiello e ho scoperto che prova a eseguire ffmpeg proprio come ho descritto e quindi fallisce. – Eskat0n

Problemi correlati