Vlcj: videoplayer.stop() вызывает сбой JVM в Windows 11 (только для некоторых видеокодеков)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Vlcj: videoplayer.stop() вызывает сбой JVM в Windows 11 (только для некоторых видеокодеков)

Сообщение Anonymous »

После переноса приложения Java vlcj на новый компьютер с Windows 11 программа аварийно завершает работу при вызове vlcjplayer.stop(). Я использую vlcj4.8.2 в сочетании с VLC3.0.21. Я отправляю свою собственную Oracle JRE версии 17.0.12.
Это соответствующая часть кода, который я вызываю (где stop()) вызывается с помощью кнопки ActionListener, а vlcPlayer имеет тип EmbeddedMediaPlayer):
public void stop() {
submit(() -> vlcPlayer.stop());// new since vlcj-4: callback to VLC from a separate thread!
}

public void submit (final Runnable runnable) {
vlcPlayer.submit(runnable);
}

Некоторые дополнительные факты:
  • Точно такой же код > на Windows 10 работает нормально! Та же версия Java
    , та же версия VLC, та же версия vlcj, та же сборка!
  • Проблема возникает только для определенных кодировок видео: mp4< /code>, mkv, ..., тогда как более старые видео в формате mpeg2 не вызывают проблем!
  • Когда я воспроизвожу проблемные видео с помощью официального теста vlcj приложения, вылетов не происходит! Я сравнил соответствующие разделы кода, но не смог найти реальной разницы в способе вызова метода остановки.
  • Похоже, проблема не связана с моей конкретной личной настройкой системы. Это происходит на любом компьютере с Windows 11, на котором я до сих пор запускал свое приложение
Файл журнала VLC не содержит никаких ошибок. Процесс просто аварийно завершает работу во время записи в него журналов. Я искал ошибки в средстве просмотра событий Windows и смог найти соответствующие события ошибок. Вот как они выглядят (к сожалению, на немецком языке):
Fehlerhafter Anwendungsname: java.exe, Version: 17.0.12.0, Zeitstempel: 0x31da67d3
Fehlerhafter Modulname: libdirect3d11_filters_plugin.dll, Version: 3.0.21.0, Zeitstempel: 0x0075006c
Ausnahmecode: 0xc0000005
Fehleroffset: 0x000000000000155a
Fehlerhafte Prozess-ID: 0x1E5C
Fehlerhafte Anwendungsstartzeit: 0x1DB641EF886AD0F
Fehlerhafter Anwendungspfad: D:\Java_Programme\Jukebox\jre-17.0.12\bin\java.exe
Fehlerhafter Modulpfad: C:\Program Files\VideoLAN\VLC\plugins\d3d11\libdirect3d11_filters_plugin.dll
Berichts-ID: a6019a38-7882-422c-bafa-2b1fa2bd6f7c
Vollständiger Name des fehlerhaften Pakets:
Fehlerhafte paketbezogene Anwendungs-ID:

Я пробовал разные вещи, например, настроил вывод видео на opengl вместо Direct3d11, а также изменил соответствующие настройки в собственном VLC, но безрезультатно. эффект. Почему-то я не могу заставить свой плеер использовать другой модуль видеовыхода. С другой стороны, я бы в любом случае не хотел заставлять пользователей вносить изменения в подобные настройки вручную. Я вообще не увлекаюсь видеокодеками, всей этой встроенной библиотекой и глубиной VLC. Я боролся с этим уже пару дней и не понимаю, что может быть не так. Если проблема связана с моим кодом Java, то почему он работает на моем старом компьютере с Windows 10 и со старыми кодеками? Если проблема связана с VLC и установленными кодеками, то почему сбой не происходит при запуске тестового приложения vlcj? Я установил последние версии драйверов графического процессора, и у меня установлена ​​чистая и свежая Windows 11.

Будем признательны за любые подсказки!
Изменить 1:< /strong>
Мне удалось сделать снимок экрана с сообщением об ошибке, которое VLC выводит на консоль. (1) — это момент, когда я вызываю vlcplayer.stop(), (2) — когда обработчик событий vlcj получает событие Stop(). Между ними собственный VLC выдает ошибку (которая, очевидно, приводит к сбою):
Изображение

Изменить [2]:

Ниже приведен (урезанный) код, который я использую. Цепочка вызовов метода следующая:
  • videoPlayer.stop()
  • submit(vlcPlayer.stop() )
  • delegate.stop()
  • vlcDelegate.controls().stop()
Этот класс является оболочкой реального проигрывателя vlc. экземпляр.
public class VideoPlayer {

// the reference to the actual vlc player (interface)
private VLCVideoInterface vlcPlayer;
// the reference to the mediaplayer factory
private MediaPlayerFactory factory;

//...

// initialize the player
public void init (final Map args) {

final Vector enhancedVLCParams = Utilities.copy(vlcParams);
enhancedVLCParams.add("--file-caching=" + bufferSize);
enhancedVLCParams.add("--network-caching=" + bufferSize);

try {// provide VLC params!
factory = new VLCVideoPlayerFactory(enhancedVLCParams);
} catch (Exception e) {
// ...
}

// read FullScreenStrategy from arguments ...
FullScreenStrategy fullScreenStrategy = null;
if (args.containsKey(Argument.FULLSCREEN_STRATEGY)) {
fullScreenStrategy = (FullScreenStrategy)args.get(Argument.FULLSCREEN_STRATEGY);
}

vlcPlayer = factory.newEmbeddedMediaPlayer();// create the vlc player!
vlcPlayer.setFullscreenStrategy(fullScreenStrategy);// assign fs strategy
vlcPlayer.addMediaPlayerEventListener(vlcEventHandler);// attach event handler to catch vlcj events

if (Platform.isWindows()) {
vlcPlayer.setEnableKeyInputHandling(false);
vlcPlayer.setEnableMouseInputHandling(false);
}

vlcPlayer.setLogoFile(VLCJ_LOGO.getPath());
vlcPlayer.setLogoOpacity(0.55f);
vlcPlayer.setLogoLocation(10, 10);
}

// stops the video player. This method is exposed to the outside world
public void stop() {
if (!isPlaying()) {
return;
}
submit(() -> vlcPlayer.stop());// new since vlcj-4: callback to VLC from a separate thread!
}

// calls to the vlc layer happen in a separate thread
public void submit (final Runnable runnable) {
vlcPlayer.submit(runnable);
}

//...
}

Этот класс — моя MediaPlayerFactory, которая создает проигрыватель vlc
public final class VLCVideoPlayerFactory extends MediaPlayerFactory {

// Constructor
public VLCVideoPlayerFactory (final List libvlcArgs) {
super(libvlcArgs);// Delegation an die Superklasse
}

// creates the vlc player instance
public VLCVideoPlayer newEmbeddedMediaPlayer() {
return new VLCVideoPlayer(libvlcInstance);
}
}

VLCVideoPlayer — это фасад, скрывающий реализацию реального проигрывателя vlc. VideoPlayer использует фасад
public final class VLCVideoPlayer extends EmbeddedMediaPlayer implements VLCVideoInterface {

private VLCVideoInterface delegate;

// constructor
VLCVideoPlayer (final libvlc_instance_t instance) {
super(instance);
this.delegate = new VLCVideoInterfaceImpl(this);
}

public void stop() {
delegate.stop();
}
}

Этот класс представляет собой фактический видеоплеер vlc
class VLCVideoInterfaceImpl extends VLCInterfaceImpl implements VLCVideoInterface {

// constructor
VLCVideoInterfaceImpl (final EmbeddedMediaPlayer mediaPlayer) {
super(mediaPlayer);
}

// stops the vlc player
public void stop() {
vlcDelegate.controls().stop();// this is the actual vlc stop call!
}
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... deo-codecs
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»