Java Runtime.getRuntime().exec() 带引号

6

我正在尝试在Linux上通过exec调用运行ffmpeg。然而,我必须在命令中使用引号(ffmpeg需要)。我一直在查看processbuilder和exec的Java文档以及stackoverflow上的问题,但似乎找不到解决方案。

我需要运行:

ffmpeg -i "rtmp://127.0.0.1/vod/sample start=1500 stop=24000" -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv

我需要将引号插入到以下参数字符串中。请注意,仅添加带有反斜杠的单引号或双引号不起作用,因为processbuilder解析和运行命令的方式的特性。

String argument = "ffmpeg -i rtmp://127.0.0.1/vod/"
                    + nextVideo.getFilename()
                    + " start=" + nextVideo.getStart()
                    + " stop=" + nextVideo.getStop()
                    + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv";

非常感谢您的帮助。

3个回答

6

创建一个数组!

exec命令可以接收一个字符串数组,这些字符串将被用作命令和参数的数组(而不是命令数组)

就像这样...

String[] arguments = new String[] { "ffmpeg", 
"-i", 
"rtmp://127.0.0.1/vod/sample start=1500 stop=24000",
"-re",
...
};

你可以删除 "new String[]" 这些字符;大括号会自动为你生成一个字符串数组。 - Jason S
1
这样是行不通的,因为rtmp://127.0.0.1/vod/sample start=xxx stop=xxx必须加上引号。将参数放入字符串数组中也没有帮助。 - Slava Markeyev
抱歉,如果您按照以下方式放置转义引号,它不会有所帮助: ""rtmp://127.0.0.1/vod/sample start=1500 stop=24000"" - laher
我现在用的是Windows电脑,但明天我会让它工作起来并告诉你。 - laher
2
与此同时,您可以通过将调用包装在一个 shell 脚本中(该脚本期望参数 $1、$2、$3)来简化调用。 - laher
谢谢amir75。按照您建议的通过shell脚本执行命令确实可行。虽然这并没有解决exec和引号的问题,但我很满意。如果您找到了解决方法,请回复我,因为我知道其他人也遇到了同样的问题,可能无法使用shell脚本来解决。 - Slava Markeyev

1

听起来你需要在参数字符串中转义引号。这很简单,只需在引号前加上反斜杠。

例如:

String containsQuote = "\"";

这将被评估为一个仅包含引号字符的字符串。

或者在您的特定情况下:

String argument = "ffmpeg -i \"rtmp://127.0.0.1/vod/"
          + nextVideo.getFilename()
          + " start=" + nextVideo.getStart()
          + " stop=" + nextVideo.getStop() + "\""
          + " -re -vcodec copy -acodec copy -f flv rtmp://127.0.0.1/live/qltv";

0
我敢打赌,你尝试的所有建议都没有起作用,因为正如你所指定的那样,"rtmp://127.0.0.1/vod/sample start=1500 stop=24000" 必须用引号括起来,并且传递带引号的参数给 exec 是行不通的,即使在 String[] 数组内部也是如此,exec 也会忽略它们。很遗憾,我认为没有直接的解决方案。在我的代码中,我尝试传递 exec 可以处理的参数,并在接收端的程序中对它们进行转换,以便可以适当地处理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接