java - 如何使用 ProcessBuilder 在 Java、MacOS 中运行 ffmpeg 命令

标签 java macos ffmpeg cross-platform processbuilder

我正在用 Java 编写一个程序,它使用 ffmpeg 将视频“剪辑”成几部分,然后将它们重新缝合在一起。我在 Windows 中的一切工作相对顺利,但我无法让 ffmpeg 在 Mac 或 Linux 中工作。不过我现在专注于mac。我认为这可能是权限问题,但是当我使用 sudo 运行它时,我收到一条错误消息(输入密码后:

sudo: ffmpeg: command not found
当我在没有 sudo 的情况下运行它时,我得到:
java.io.IOException: Cannot run program "ffmpeg": error=2, No such file or directory
我认为这可能是因为 Mac 机器上的 ffmpeg 包是使用自制软件下载的,而 ffmpeg 存储在/usr/local/Cellar/ffmpeg 而不是默认文件夹中,无论它可能在哪里。但这可能不是问题,因为我删除了 ffmpeg 并用自制软件重新下载了它。在我的第一次测试中,它也可能位于其 defaulter 文件夹中。弄清楚这一点会很棒。我的大多数家人都使用 Mac(不是我),我真的很想与他们分享我的工作。这就是我选择用 Java 编写代码的原因。哦,我确实尝试使用命令中的二进制目录。这是代码:
    //snips out all the clips from the main video
    public void snip() throws IOException, InterruptedException {
        
        for(int i = 0; i < snippets.size(); i++) {
            //ffmpeg -i 20sec.mp4 -ss 0:0:1 -to 0:0:5 -c copy foobar.mp4
            String newFile = "foobar" + String.valueOf(i) + ".mp4";
            
            //THIS WORKS
            if(OS.isWindows()) {
                ProcessBuilder processBuilder = new ProcessBuilder("ffmpeg", "-i", videoName, "-ss",
                        snippets.get(i).getStartTime(), "-to", snippets.get(i).getEndTime(), newFile);
                            
                Process process = processBuilder.inheritIO().start();
                process.waitFor();
                System.out.println("Win Snip " + i + "\n");
            }
            
            else if (OS.isMac()) {
                //FFMPEG LOCATION: /usr/local/Cellar/ffmpeg
                //THE ERROR: sudo: ffmpeg: command not found
                //ERROR W/OUT SUDO: java.io.IOException: Cannot run program "ffmpeg": error=2, No such file or directory
                ProcessBuilder processBuilder = new ProcessBuilder("sudo", "-S", "ffmpeg", "-f", videoName, "-ss",
                        snippets.get(i).getStartTime(), "-to", snippets.get(i).getEndTime(), newFile);
                
                Process process = processBuilder.inheritIO().start();
                process.waitFor();
                System.out.println("Mac Snip " + i + "\n");
            }
            
            else if (OS.isUnix()) {
                System.out.println("Your operating system is not supported");
                //TODO
                //need to figure out if deb/red hat/whatever are different
            }
            
            else if (OS.isSolaris()) {
                System.out.println("Your operating system is not supported yet");
                //TODO probably won't do
            }
            
            else {
                 System.out.println("Your operating system is not supported");
            }
            //add to the list of files to be concat later
            filesToStitch.add(newFile);
            filesToDelete.add(newFile);
            
        }
        //System.out.println(stitchFiles);
    }

最佳答案

由于 Mac OS 是基于 UNIX 的,如果位置不在配置的路径(即 $PATH 环境变量)中,则需要在可执行文件名称之前放置“./”。将“ffmpeg”更改为“./ffmpeg”应该可以工作(假设它确实位于工作目录中 - 如果需要,您还可以通过调用 ProcessBuilder 上的 directory() 来更改工作目录)。

关于java - 如何使用 ProcessBuilder 在 Java、MacOS 中运行 ffmpeg 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63236366/

相关文章:

java - groovy/java 检查列表交集并组合元素

video - 使用 ffmpeg 将 h264(隔行扫描)上的流编码复用到 mp4

video - ffmpeg插入一个循环以使其平滑

c++ - 如何使用 gcc 模仿 Microsoft 版本的 __FUNCTION__?

macos - vi命令:将所有行从远程文件复制到剪贴板,并将其粘贴到主机编辑器

ffmpeg - 如何使用 FFMPEG 命令行将附件 B 格式的原始 H.264 转换为 AVCC

Java jackson : serialize a class with two field instead of all class

java - 在java中显示打乱的整数数组

java - 使用按钮停止和开始循环

cocoa - iPhoto '11 插件可以开发吗?