mediaPlayer.setSpu() не работает
В настоящее время я работаю над кодом, основанным на VLCJ, для воспроизведения видеоконтента, который работает довольно хорошо, но я изо всех сил пытаюсь заставить метод setSpu() работать.
Просто чтобы упомянуть, когда дело доходит до загрузки внешних субтитров, в файле, кроме видеофайла, он работает нормально. Проблема появляется, когда я пытаюсь воспроизвести субтитры, содержащиеся в медиа-файле. (например, подпрограммы, содержащиеся в файле MKV).
Я внимательно прочитал пост GitHub "setSpu не работает # 278", и я думаю, что, возможно, проблема в том, что я неправильно вызываю метод setSpu().
Чтобы упростить это, я пытаюсь заставить это работать на примере "uk.co.caprica.vlcj.test.basic.TestPlayer".
В классе TestPlayer.java я загрузил все необходимые библиотеки vlc и настроил mediaPath и mediaPlayer, поэтому, если я выполню класс, медиапроигрыватель будет построен правильно, и видео начнет воспроизводиться.
Теперь, чтобы попытаться заставить работать субтитры, я снова использовал кнопку "subTitlesButton" на "PlayerControlsPanel.java". Прежде всего, поскольку подлежащим установке spu является идентификатор TrackDescription, я добавил следующий код и выполнил его, чтобы получить список spuDescription:
subTitlesButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(mediaPlayer.getSpuDescriptions());
}
});
Когда кнопка Sub-title нажата, получается следующий вывод:
spuDescriptions=[TrackDescription[id=-1,description=Deshabilitar], TrackDescription[id=3,description=Pista 1 - [Español]], TrackDescription[id=4,description=Pista 2 - [Inglés]], TrackDescription[id=5,description=Pista 3 - [Español]]]
Итак, для простоты, я просто попытался добавить следующий код и выполнить его:
subTitlesButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(mediaPlayer.getSpuDescriptions());
mediaPlayer.setSpu(3); // TrackDescription[id=3,description=Track 1 - [Spanish]]
}
});
Ожидаемым результатом будет подзаголовок "Трек 1 - [Испанский]" с ID=3, который появится на экране, но ничего не происходит. Видео продолжается и воспроизводится правильно, но подзаголовок не отображается.
Все остальные кнопки работают нормально, когда вы нажимаете их, вы получаете ожидаемый результат (пауза, остановка, воспроизведение, перемотка вперед, перемотка и т. Д.)... поэтому я не понимаю, почему media.setSpu() не является работает там.
Был бы очень признателен за некоторую помощь:) Заранее спасибо.
РЕДАКТИРОВАНИЕ Точная проблема заключалась в том, что все субтитры, содержащиеся в медиа-файле (video.mkv), были закодированы в тексте UTF8. Я попытался заново смонтировать файл video.mkv с помощью mkvmerge, но эта программа всегда конвертирует файлы SRT в текстовый формат UTF8. ВОЗМОЖНОЕ РЕШЕНИЕ преобразуйте файлы SRT в формат субтитров ASS. Если video.mkv содержит формат субтитров.ASS, субтитры всегда правильно загружаются VLC, а также библиотеками vlcj.
Большое спасибо заранее за всю предоставленную помощь.
1 ответ
Если этот вопрос можно понять, как использовать внешние файлы SPU с символами, отличными от ASCII, вы можете попробовать это:
Предположим, у вас есть какое-то имя для вашего внешнего файла SPU, имя файла, содержащее не-ASCII символы, давайте назовем это spuFileName
...
Пытаться:
String asciiFileName = new File(spuFileName)
.toURI()
.toASCIIString();
Или же:
String asciiFileName = new File(spuFileName)
.toURI()
.toASCIIString()
.replaceFirst("file:/", "file:///");
Тогда используйте asciiFileName
вместо этого, когда вы указываете файл SPU для vlcj.
Если я правильно помню, LibVLC требует ASCII-строк в своем API. Эта проблема также может проявиться, если вы попытаетесь воспроизвести видео с именем файла, которое содержит символы, отличные от ASCII (vlcj обнаруживает это и обрабатывает его автоматически).
Но я не уверен, что это действительно ваша проблема, поскольку, учитывая частичный журнал, который вы разместили, похоже, что VLC действительно обнаружил треки SPU правильно.
С другой стороны, если это предложение действительно работает, vlcj может быть изменен для автоматической обработки этого случая (внешний файл SPU).
При фактическом выборе SPU для отображения независимо от того, находятся ли они в отдельном файле или содержатся в самом видео, единственное, что имеет значение, это идентификатор дорожки SPU. vlcj передает этот идентификатор непосредственно в метод API LibVLC. Тот факт, что строки описания дорожки не кодируются напрямую, не имеет значения.
В более ранних версиях VLC этот идентификатор был фактически индексом дорожки SPU - так 0, 1, 2, 3 и так далее.
В текущей версии VLC (она была изменена примерно в феврале 2013 года, я думаю, это означает, что VLC 2.1+) было исправлено использование реальных идентификаторов дорожек SPU.
Поэтому, в зависимости от вашей версии VLC, если идентификаторы дорожек не работают для вас, попробуйте просто передать индекс.