如何在Java中运行FFmpeg命令(Windows)

问题描述 投票:0回答:4

我在命令提示符下成功执行了以下 FFmpeg 终端命令。但我无法在我的 Java 程序中执行这个命令。我可以执行 Java 程序中没有双引号的所有其他 FFmpeg 命令。这里我只有双引号有问题(

"..."
)。

ffmpeg -i "concat:C:\\journalism\\videos\\vid1.ts|C:\\journalism\\videos\\vid2.ts" -c copy C:\\journalism\\videos\\output.mp4

我可以在命令提示符下成功执行上面的命令。但我在我的 Java 代码中尝试如下:

Runtime.getRuntime().exec("C:\\ffmpeg\\bin\\ffmpeg -i 'concat:C:\\journalism\\videos\\vid1.ts|C:\\journalism\\videos\\vid2.ts' -c copy C:\\journalism\\videos\\output.mp4");

即使我尝试用单引号替换双引号。但没有成功。

有人可以帮我解决这个问题吗?

提前致谢

java ffmpeg processbuilder runtime.exec
4个回答
7
投票

我自己找到了答案。我没有使用 String 对象,而是使用 String 数组,如下所示,然后命令执行成功。

String[] cmd={"C:\\ffmpeg\\bin\\ffmpeg","-i", "concat:C:\\journalism\\videos\\vid1.ts|C:\\journalism\\videos\\vid2.ts", "-c", "copy", "C:\\journalism\\videos\\output.mp4"};
Runtime.getRuntime().exec(cmd);

2
投票

我的程序正在运行,我只是使用如下。希望对你有帮助:

String cmd =“ffmpeg -i http://117.103.224.78/videoinput/Video1.mp4 -s 1920x1080 -c:副本 D:\tmp\Video2.mp4”;

进程 p = Runtime.getRuntime().exec(cmd);


0
投票

我也尝试做同样的事情,这段代码成功了。

String exeLocation = "\"C:\\Program Files\\ffmpeg\\bin\\ffmpeg\"";
String extractFileName = "test.mp4";
String extractFullPath = "C:\\ac3" + "\\" + extractFileName;
String dest = "C:\\\\ac3\\\\output.mp4";

String cmd = exeLocation + " -i " + extractFullPath + " -c copy " + dest ;
Runtime.getRuntime().exec(cmd);

0
投票

要查看实际应用程序中的用法,请参阅 GitHub 上的此项目

可以使用org.bytedeco.javacv库中发布的FFmpeg和FFprobe。

首先,添加所需操作系统的依赖项(请参阅此处了解支持的操作系统):

// The main artifact
implementation("org.bytedeco:ffmpeg:7.1-1.5.11")
// The Jar artifact with FFmpeg and FFprobe executables for the desired OS
implementation("org.bytedeco:ffmpeg:7.1-1.5.11:windows-x86_64-gpl")

在Java中执行FFmpeg:

import org.bytedeco.ffmpeg.ffmpeg;
import org.bytedeco.javacpp.Loader;

public class Test {
    private final String ffmpegPath = Loader.load(ffmpeg.class);
    public void executeFFmpeg() throws IOException {
        var ffmpegProcess = new ProcessBuilder()
                .command(
                        ffmpegPath,
                        // OR any options you would pass to FFmpeg CLI
                        "-i", "/absolute/path/to/video.mp4"
                )
                .start();
        try (var reader = new BufferedReader(new InputStreamReader(ffmpegProcess.getErrorStream()))) {
            reader
                    .lines()
                    .forEach(System.out::println);
        }
    }
}

在 Kotlin 中执行 FFmpeg:

import org.bytedeco.ffmpeg.ffmpeg
import org.bytedeco.javacpp.Loader

class Test() {
    private val ffmpegPath = Loader.load(ffmpeg::class.java)
    fun executeFFmpeg() {
        ProcessBuilder()
            .command(ffmpegPath, "-i", "/absolute/path/to/video.mp4")
            .runCatching { start() }
            .onFailure { println("Starting the FFmpeg process failed") }
            .getOrNull()
            ?.errorStream
            ?.reader()
            ?.useLines { lines -> lines.forEach(::println) }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.