У меня есть несколько сотен эпизодов аниме, для которых я хотел бы объединить имеющиеся у меня субтитры и видеофайлы. Я решил написать короткую программу на 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");
}
}