我在命令提示符下成功执行了以下 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");
即使我尝试用单引号替换双引号。但没有成功。
有人可以帮我解决这个问题吗?
提前致谢
我自己找到了答案。我没有使用 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);
我的程序正在运行,我只是使用如下。希望对你有帮助:
String cmd =“ffmpeg -i http://117.103.224.78/videoinput/Video1.mp4 -s 1920x1080 -c:副本 D:\tmp\Video2.mp4”;
进程 p = Runtime.getRuntime().exec(cmd);
我也尝试做同样的事情,这段代码成功了。
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);
可以使用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) }
}
}