Предотвратить ffmpeg от захвата stdout - PullRequest
0 голосов
/ 16 февраля 2011

Когда я делаю system "ffmpeg -i just-do-it.mp4 -ab 96k -ar 22050 -qscale 6 output.flv" ffmpeg берет на себя процесс ruby, пока работа не будет выполнена, что иногда занимает много времени.Я пытался использовать потоки amd fork в Ruby безрезультатно, также system эквивалентные команды, такие как exec %x[] Я также пробовал последние Fibers в ruby ​​1.9.2, но я не думаю, что я использую егоправильно.

Мой вопрос: как запустить одновременно два процесса ffmpeg из ruby?

РЕДАКТИРОВАТЬ:

fork do
  fork do
    system "ffmpeg -i you-know.mp4 -ab 96k -ar 22050 -qscale 6 #{Time.now.sec}.flv"
  end                            

  fork do
    system "ffmpeg -i bangbang.mp4 -ab 96k -ar 22050 -qscale 6 #{Time.now.sec}.flv"
  end
end

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

fork/exec - правильное решение. Поскольку разветвленные процессы наследуют дескрипторы файлов fopen родительских процессов / и т. Д., Вам придется закрыть (или перенаправить) дескрипторы файлов, которые вы не хотите использовать дочерними процессами.

Например:

# this will print nothing, but yes is running as a forked process
# you'll want to `killall yes` after running this script.
fork do
  [$stdout, $stderr].each { |fh| fh.reopen File.open("/dev/null", "w") }
  exec "yes"
end

Хорошо, некоторые комментарии к коду, который вы разместили. Внешнее fork бессмысленно. Просто разветвите два процесса ffmpeg из основного процесса. Может быть, напишите вспомогательную функцию, например:

def ffmpeg(mp4)
  fork do
    [$stdout, $stderr].each { ... }
    exec "ffmpeg -i #{mp4} ..."
  end
end

ffmpeg("you-know.mp4")
ffmpeg("bangbang.mp4")
0 голосов
/ 10 июня 2011

Попробуйте использовать гем подпроцесса - это то, что я сейчас использую для работы с процессами разветвления и для упрощения его использования.

Например,

    work_list.each do |cmd|
        process = Subprocess::Popen.new(cmd)
        process.run
        process.wait
        #puts process.stdout
        #puts process.stderr
        puts process.status
    end
...