老哥们我有一个在 Linux 执行 Java Process 的问题

2023-05-25 22:34:36 +08:00
 DIO

我想将类似 ffmpeg -i “input.mkv” -i “input.chs&jpn.ass” -c copy "output/output1.mkv" 这样的命令由 Java 代码来执行

java

        List<String> command = new ArrayList<>();  
        command.add(ffmpegPath);  
        command.add("-i");  
        //输入视频文件 File
        command.add(file.getAbsolutePath());  
        command.add("-i");  
        //输入字幕文件 File
        command.add(sub.getAbsolutePath());  
        command.add("-c");  
        command.add("copy");  
        //拼接输出路径
        command.add((new File(out,fileName)).getAbsolutePath());

由于考虑多平台运行,所以路径获取和拼接都是通过 File ,没有自己加 Separate 。

在 windows 编译执行没问题,成功进行了分类

但是在 linux,总是执行失败

Log 以后,提示是这样的:

INFO: "/home/codeTest/ffmpegSubTest/[Kamigami&VCB-Studio] Boku dake ga Inai Machi [01][Ma10p_1080p][x265_flac_ac3].mkv": No such file or directory 其实已经分好类了,也就是说 File 对象指向是符合我预期的,只是创建文件夹利用的是 Java File 类的 mkdirs ()。

那就是 ffmpeg 命令这里参数出了问题,我试过给参数再套一层双引号(""),同样是 win 编译执行 ok ,linux “No such file or directory”

请问如何处理参数问题,或者有更好的解决方案希望能赐教

java Process 在不同平台执行看了会源码没看太明白。

2094 次点击
所在节点    程序员
23 条回复
msg7086
2023-05-26 09:45:20 +08:00
Linux 下,Shell 才是负责转义的,包括空格,&,[],等等,都只有在经过 Shell 的时候(比如 bash -c ,或者在命令行提示符下运行时)。

直接从 Java 调用 syscall 运行的时候加双引号是错误的行为。

我想这也是为什么你一开始的提示里

"/home/codeTest/ffmpegSubTest/[Kamigami&VCB-Studio] Boku dake ga Inai Machi [01][Ma10p_1080p][x265_flac_ac3].mkv": No such file or directory

会有双引号的原因。因为你这样写的话就是要寻找 [.] / ["] / [home] 这个目录了。
DIO
2023-05-26 10:00:37 +08:00
@msg7086 感谢您,他好像开始工作了。昨天可能是头疼所以把转义字符去掉以后忘记修改代码到 NAS 。
loginv2
2023-05-26 10:46:57 +08:00
简化输入文件名 使用绝对目录定位。我记得 ffmpeg 以前我载入 ass 文件的时候 相对路径总出错 不知道是我用的不对 还是怎么样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943015

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX