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