带引号的Java java.getjava.exec()

k2fxgqgv  于 2023-10-14  发布在  Java
关注(0)|答案(3)|浏览(83)

我试图通过Linux上的exec调用运行ffmpeg。但是,我必须在命令中使用引号(ffmpeg需要它)。我一直在看java文档中关于processbuilder和exec以及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";

任何帮助将不胜感激。

66bbxpm5

66bbxpm51#

布阵!
exec可以接受一个字符串数组,它被用作命令和参数的数组(与命令数组相反)
像这样的事。。

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

zi8p0yeb2#

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

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";
c0vxltue

c0vxltue3#

我敢打赌,这些建议对你都不起作用,因为正如你所指定的那样,“rtmp:127.0.0.1/vod/sample start=1500 stop=24000”必须在它周围加上引号,并且用引号将参数传递给exec,例如“\“rtmp://127.0.0.1/sample start=1500 stop=24000\”不会起作用,因为exec会忽略它们,即使在String[]数组中也是如此。不幸的是,我不认为有一个简单的解决方案。我在自己的代码中所做的是尝试传递exec可以处理的参数,并在接收端程序端转换它们,以便它们可以被充分处理。

相关问题