ruby-on-rails - 防止ffmpeg接管stdout

标签 ruby-on-rails ruby multithreading ffmpeg fiber

当我做 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

最佳答案

fork/exec是正确的解决方案。由于 fork 进程继承父进程 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")

关于ruby-on-rails - 防止ffmpeg接管stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009829/

相关文章:

ruby-on-rails - 使用 Heroku 和 CloudFront 从 RapidSSL 获得的 SSL 证书

ruby-on-rails - Rails 上的 OAuth(Twitter、Facebook、LinkedIn 等)

ruby - 如何在单个语句/检查中替换嵌套哈希的多个 nil 检查?

ruby - 我如何在 rspec for sinatra 中使用 omniauth?

ruby-on-rails - rails ActiveRecord : Multiple conditions in find

java - Toolkit 和 PaintComponent 不能一起工作

ruby-on-rails - 如何将Kafka客户端添加到Rails Docker部署中?

ruby-on-rails - Recaptcha::RecaptchaError in Articles#show 未指定站点 key

linux - 如何正确使用libevent的信号事件

java:停止单例线程