Это соответствующая часть кода, который я вызываю (где 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, на котором я до сих пор запускал свое приложение
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()
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