- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几百集的动漫,我想将其字幕和视频文件合并为一个。我决定编写一个简短的 Java 程序来遍历文件并合并它们。视频文件名为 Bleach1.mkv,字幕为 Bleach1.srt。为了避免任何潜在的空间问题,文件保存在我的 C 驱动器的根目录下。我写的代码如下。
根据 mkvmerge 的文档,适当的命令行调用是“mkvmerge -o remux_Bleach1.mkv Bleach1.mkv Bleach1.srt”。我已经确认,这确实有效。我现在正在从不同的文件夹运行 java 程序,所以我为每个文件使用了绝对路径。
我的代码中的命令打印为“[C:\Program Files\MKVToolNix\mkvmerge.exe, -o C:\Bleach\remux_Bleach_1.mkv C:\Bleach\Bleach_1.mkv C:\Bleach\Bleach_1 .srt]"
我从 mkvmerge 返回的错误消息是“错误:未给出目标文件名。”
我不明白在使用 ProcessBuilder 时参数是如何传递的——我做错了什么?
import org.apache.commons.io.FilenameUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static String mkvmergePath = "C:\\Program Files\\MKVToolNix\\mkvmerge.exe";
public static void mergeVideoAndSubtitles(final File folder, String videoExtension, String subtitleExtension) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry, videoExtension, subtitleExtension);
// for each mkv file that is found
} else if (FilenameUtils.isExtension(fileEntry.getName(), videoExtension)) {
String parentFolderPath = fileEntry.getParentFile().getPath();
String baseName = FilenameUtils.getBaseName(fileEntry.getName());
String outputFileAbsolutePath = parentFolderPath + "\\remux_" + fileEntry.getName();
String inputVideoAbsolutePath = fileEntry.getAbsolutePath();
String inputSubtitleAbsolutePath = parentFolderPath + "\\" + baseName + "." + subtitleExtension;
String param1 = "-o " + outputFileAbsolutePath + " " + inputVideoAbsolutePath + " " +
inputSubtitleAbsolutePath;
// String param2 = "--default-track \"und\"";
// String param3 = "--language 0:und " + baseName + "." + subtitleExtension + "\"";
// System.out.println(param1);
// System.out.println(param2);
// System.out.println(param3);
BufferedReader br = null;
String line;
try {
List<String> list = new ArrayList<String>();
list.add(mkvmergePath);
list.add(param1);
ProcessBuilder build = new ProcessBuilder(list);
System.out.println(build.command());
Process process = build.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
final File folder = new File("C:\\Bleach");
mergeVideoAndSubtitles(folder, "mkv", "srt");
}
}
最佳答案
我在用 Go 编写一个类似的程序时遇到了同样的错误。显然参数中的空格(例如 --language 0:eng)导致了这个问题。我试图将它们分成单独的参数,它似乎有效:
public static void main(String[] args) throws IOException {
String mkvmerge = "C:\\Program Files\\MKVToolNix\\mkvmerge.exe";
List<String> command = new ArrayList<String>();
command.add(mkvmerge);
command.add("--ui-language");
command.add("en");
command.add("--output");
command.add("D:\\Dump\\test.mkv");
command.add("--language");
command.add("0:eng");
command.add("--default-track");
command.add("0:yes");
command.add("--language");
command.add("1:eng");
command.add("--default-track");
command.add("1:yes");
command.add("--language");
command.add("2:eng");
command.add("D:\\Dump\\Game of Thrones\\Game.of.Thrones.S01.1080p.WEB-DL.DD5.1.H.264-SA89[rartv]\\Game.of.Thrones.S01E01.Winter.Is.Coming.1080p.WEB-DL.DD5.1.H.264-SA89.mkv");
command.add("--sub-charset");
command.add("0:UTF-8");
command.add("--language");
command.add("0:eng");
command.add("D:\\Dump\\Game of Thrones\\Game.of.Thrones.S01.1080p.WEB-DL.DD5.1.H.264-SA89[rartv]\\Subs\\Game.of.Thrones.S01E01.Winter.Is.Coming.1080p.WEB-DL.DD5.1.H.264-SA89.srt");
command.add("--track-order");
command.add("0:0,0:1,0:2,1:0");
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process process = builder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
出于某种原因,这不适用于路径中的空格。这在 Go 中也适用。
关于java - 如何从 Java 程序中正确调用 mkvmerge?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090605/
我正在使用 mkvmerge 使用此批处理代码拆分我的视频文件: for %%a in ("*.mp4") do "C:\Program Files (x86)\MKVToolNix\mkvmerge
我有几百集的动漫,我想将其字幕和视频文件合并为一个。我决定编写一个简短的 Java 程序来遍历文件并合并它们。视频文件名为 Bleach1.mkv,字幕为 Bleach1.srt。为了避免任何潜在
我试过这个:- mkvmerge -o new_file.ogg --split parts:0s-104s,+94s-208s,+8s-12s,+312s-410s,+17s-21s 500.ogg
背景 我正在开发一个项目,其中视频和音频是 MKV 源文件的算法解释,我使用 ffmpeg -ss 和 -t 将音频和视频的特定区域提取到单独的文件中。我在音频过程中使用视频中的场景变化(即视频场景变
我有几个视频及其对应的 .srt 文件。我正在尝试使用循环合并它们,但我被卡住了。这段代码不起作用: for i in *".avi" do mkvmerge -o "$i.mkv"\
我是一名优秀的程序员,十分优秀!