gpt4 book ai didi

ruby - 如何将 Ruby 的 STDIN 传递给 Open3.popen3 调用的外部程序?

转载 作者:行者123 更新时间:2023-12-04 23:06:18 27 4
gpt4 key购买 nike

我想从 Ruby 脚本调用 ffmpeg,让我们调用“vpipe”,并且我希望这个 Ruby 脚本充当类似命令的过滤器:从管道获取其输入。它的唯一目的是选择第一个音频流并删除章节数据(如果存在):

#!/usr/bin/ruby
require "open3"

output_file=ARGV[0]

cmd=%Q{ffmpeg -y -i - -map 0:v -map 0:a -c:v copy -c:a:0 copy -map_chapters -1 #{output_file}}

Open3.popen3(cmd,:stdin_data=>STDIN)

然后我想如下调用我的程序:
curl http://www.example.com/video.wmv | vpipe processed.wmv

不幸的是不起作用,因为 popen3 没有这样的选项:stdin_data。我也试过 Open3.capture3 可以接受这个论点,但后来我从 curl 收到一条错误消息:“写入正文失败”。

最佳答案

当您的程序位于管道命令的下游时,它的 STDIN 将被提供上一个命令的输出。

当您使用 Open3.popen3 ,您可以完全控制 fork 进程' STDIN , STDOUT , STDERR .您需要手动为其提供所需的数据,并根据需要使用输出。

Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
# consume outputs in STDOUT and STDERR, otherwise the ffmpeg process may be blocked if it produces a lot of outputs
Thread.new do
while stdout.read
end
end
Thread.new do
while stderr.read
end
end
while data = STDIN.read(64) # read output of the upstream command
stdin.write(data) # manually pipe it to the ffmpeg command
end
wait_thr.join
end

关于ruby - 如何将 Ruby 的 STDIN 传递给 Open3.popen3 调用的外部程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31729282/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com