0

当我这样做时,system "ffmpeg -i just-do-it.mp4 -ab 96k -ar 22050 -qscale 6 output.flv"ffmpeg 会接管 ruby​​ 进程,直到工作完成,这有时需要很长时间。我尝试在 Ruby 中使用线程 amd fork 无济于事,同样的system命令也像exec %x[]我也在 ruby​​ 1.9.2 中尝试了最新的 Fibers,但我认为我没有正确使用它。

我的问题是如何同时从 ruby​​ 运行两个 ffmpeg 进程?

编辑:

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
4

2 回答 2

3

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毫无意义。只需从主进程中 fork 两个 ffmpeg 进程即可。也许写一个辅助函数,如:

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

ffmpeg("you-know.mp4")
ffmpeg("bangbang.mp4")
于 2011-02-15T21:58:35.113 回答
0

试试 subprocess gem - 这就是我现在用来处理进程分叉并发现它更容易使用的东西。

例如

    work_list.each do |cmd|
        process = Subprocess::Popen.new(cmd)
        process.run
        process.wait
        #puts process.stdout
        #puts process.stderr
        puts process.status
    end
于 2011-06-09T23:00:45.240 回答