Я пытаюсь запустить фильм, используя класс обработки 2.0.
Если я запустил свою программу из своего редактора кода (Eclipse в моем случае), все будет хорошо работать, и код работает безупречно: он находит и запускает фильм.
Однако, когда я экспортирую свою программу в банку и запускаю ее с моего терминала, она находит файл, но при сбоях при попытке его открыть.
В настоящее время я использую этот код для поиска строки пути к фильму.
public String locateMovie(String moviePath) {
String movie = MoviePlayer.class.getClassLoader().getResource(moviePath).getPath();
if (movie == null) {
System.out.println("FATAL ERROR --- Movie file not found: '" + moviePath + "'");
}
return movie;
}
Как вы можете видеть, я использую classLoader для поиска файла для меня, так как пути меняются после того, как я экспортирую его в файл.jar и не хочу менять все пути самостоятельно. Файл.getPath() удаляет "Файл:" в файле:/Path/To/My/File, так как это ненужный побочный эффект от использования вышеуказанного способа.
Еще немного в моем коде. Я уже добавил дополнительную проверку, чтобы увидеть, нет ли чего-то неправильного пути, который возвращает классLoader, я делаю это со следующими строками.
File temp = new File(moviePath);
System.out.println("If I have something after this, the file exists: '" + temp + "'");
Он всегда возвращает правильный путь, независимо от того, выполняется ли он из моего Eclipse (/Users/Path/To/My/Folder/2/java/Game/movies/introMovie.mp4) или из исполняемого файла.jar(introMovie.mp4),
Сначала мне показалось странным, что в файле.jar он сразу же дал мне файл без пути, ведущего к нему, потому что он имеет некоторую структуру в моем проекте, но после использования
jar tf myProject.jar
команда в моей командеLine возвращает тот же файл/путь к файлу, чтобы путь был правильным, и все здесь хорошо.
Но теперь, когда я пытаюсь загрузить фильм через Process 'Movie class со следующим кодом:
currentMovie = new Movie(parent, moviePath);
Он выдает исключение java.lang.StringIndexOutOfBoundsException и сбой. Я понятия не имею, что я делаю неправильно, так как этот код работает безупречно из моего редактора кода. + Я использую тот же способ поиска файлов для своих аудиофайлов, и те, которые запускаются без изменений, даже из исполняемого файла.jar.
Насколько я могу судить по чтению справочной библиотеки класса Movie, ему просто нужно место, чтобы отобразить его и путь к файлу, который я даю.
Я надеялся, что какой-нибудь ветеран сможет увидеть, что я делаю неправильно, и помог мне решить эту проблему, с которой я боролся в течение нескольких дней. Это, наверное, что-то глупое, что я сейчас просто смотрю.
Я не знаю точно, что случилось, но вот пару вещей, которые я бы сделал:
проверьте разрешения на видеофайл, убедитесь, что программа будет иметь к нему доступ.
Я читал, что лучше использовать
Thread.currentThread().getContextClassLoader()
чем класс classloader, но я не знаю, поможет ли это.
Библиотеки обработки имеют открытый исходный код. Может быть, посмотрите, где именно вызывается это исключение, и посмотрите на источник. Это может помочь вам определить проблему.