admin管理员组文章数量:1323193
After migrating my Java vlcj application to my new Windows 11 machine, the program crashes on calling vlcjplayer.stop()
. I am using vlcj 4.8.2 in combination with VLC 3.0.21. I am shipping my own Oracle JRE, the version is 17.0.12.
This is the relevant part of the code I am calling (where stop()
is being called from a button ActionListener
and vlcPlayer
is of the type 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);
}
Some side facts:
- The exact same code is running fine on Windows 10! Same Java version, same VLC version, same version of vlcj, same build!
- The problem only occurs for certain videos encodings:
mp4
,mkv
, ..., whereas oldermpeg2
videos do not cause the issue! - When I play the problematic videos using the official vlcj test application, the crashes do not occur! I compared the respective code sections, but could not find a real difference in the way the stop method is being invoked
- The issue seems not to be connected to my specific personal system setup. It occurs on any Windows 11 machine I have run my application on so far
The VLC logfile does not contain any errors. The process just crashes while logs are being written to it. I was searching the Windows event viewer for errors and I could find the respective error events. Here is how they look like (it's in German unfortunately):
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:
I have tried various things like setting the video output to opengl
instead of direct3d11
, and I have also changed the respective settings in native VLC, but with no effect. Somehow I cannot get my player to use another video output module. On the other hand, I would not want to force users to make manual changes to these kind of settings anyways. I am not into video codecs, the whole native library stuff and the depths of VLC at all. I have been struggling with this for a couple of days now and don't see what could be wrong.
If the issue is with my Java code, then why does it run on my old Windows 10 machine and with older codecs? If the issue is with VLC and the installed codecs, then why does the crash not happen when I run the vlcj test application? I have installed the latest GPU drivers and I have a clean and fresh Windows 11 installation.
I managed to capture a screenshot of an error message VLC logs to the console. (1) is where I call vlcplayer.stop()
, (2) is when the vlcj event handler receives the stopped()
event. In between the native VLC throws an error (that leads to the crash, obviously):
Working code example:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import uk.co.caprica.vlcj.filefilters.swing.SwingFileFilterFactory;
import uk.co.caprica.vlcj.playerponent.EmbeddedMediaPlayerComponent;
/**
* @author Oender
*/
public class VLCJTest extends JFrame {
private static final long serialVersionUID = 1L;
private EmbeddedMediaPlayerComponent playerComponent;
/**
* Constructor
*/
public VLCJTest() {
super.setTitle("VLCJ Test (fixed)");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playerComponent = new EmbeddedMediaPlayerComponent();
initComponents();
}
/**
* Initialize & arrange components
*/
private void initComponents() {
final JPanel content = new JPanel (new BorderLayout());
content.setPreferredSize (new Dimension(400,300));
final JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(new EtchedBorder());
final JButton openButton = new JButton("Open");
openButton.setFocusable(false);
final JButton stopButton = new JButton("Stop Video");
stopButton.setFocusable(false);
// attach ActionListener
openButton.setActionCommand("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
final JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(SwingFileFilterFactory.newMediaFileFilter());
final int state = chooser.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
playerComponent.mediaPlayer().media().play(chooser.getSelectedFile().getPath());
}
}
});
// attach ActionListener
stopButton.setActionCommand("Stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
playerComponent.mediaPlayer().controls().stop();
}
});
buttonPanel.add(openButton);
buttonPanel.add(stopButton);
content.add(buttonPanel, BorderLayout.NORTH);
content.add(playerComponent, BorderLayout.CENTER);
super.setContentPane(content);
super.pack();
super.setVisible(true);
}
/**
* @param args
*/
public static void main (String[] args) {
new VLCJTest().setVisible(true);
}
}
Code example that causes the crash:
```java
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import com.sun.jna.NativeLibrary;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.filefilters.swing.SwingFileFilterFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.videosurface.ComponentVideoSurface;
/**
* @author Oender
*/
public class VLCJTest extends JFrame {
private static final long serialVersionUID = 1L;
private EmbeddedMediaPlayer player;
/**
* Constructor
*/
public VLCJTest() {
super.setTitle("VLCJ Test (crash)");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Canvas videoCanvas = new Canvas();
player = initPlayer(videoCanvas);
initComponents(videoCanvas);
}
/**
* Initialize & arrange components
* @param videoCanvas
*/
private void initComponents (final Canvas videoCanvas) {
final JPanel content = new JPanel (new BorderLayout());
content.setPreferredSize (new Dimension(400,300));
final JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(new EtchedBorder());
final JButton openButton = new JButton("Open");
openButton.setFocusable(false);
final JButton stopButton = new JButton("Stop Video");
stopButton.setFocusable(false);
// attach ActionListener
openButton.setActionCommand("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
final JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(SwingFileFilterFactory.newMediaFileFilter());
final int state = chooser.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
player.media().play(chooser.getSelectedFile().getPath());
}
}
});
// attach ActionListener
stopButton.setActionCommand("Stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
player.controls().stop();
}
});
buttonPanel.add(openButton);
buttonPanel.add(stopButton);
content.add(buttonPanel, BorderLayout.NORTH);
content.add(videoCanvas, BorderLayout.CENTER);
super.setContentPane(content);
super.pack();
super.setVisible(true);
}
/**
* create the EmbeddedMediaPlayer
* @param canvas
* @return
*/
private EmbeddedMediaPlayer initPlayer (final Canvas canvas) {
final MediaPlayerFactory factory = new MediaPlayerFactory();
final ComponentVideoSurface videoSurface = factory.videoSurfaces().newVideoSurface(canvas);
final EmbeddedMediaPlayer mPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
mPlayer.videoSurface().set(videoSurface);
mPlayer.video().setAdjustVideo(true);
return mPlayer;
}
/**
* @param args
*/
public static void main (String[] args) {
NativeLibrary.addSearchPath("libvlc", "C:\\Program Files\\VideoLAN\\VLC");
new VLCJTest().setVisible(true);
}
}
After migrating my Java vlcj application to my new Windows 11 machine, the program crashes on calling vlcjplayer.stop()
. I am using vlcj 4.8.2 in combination with VLC 3.0.21. I am shipping my own Oracle JRE, the version is 17.0.12.
This is the relevant part of the code I am calling (where stop()
is being called from a button ActionListener
and vlcPlayer
is of the type 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);
}
Some side facts:
- The exact same code is running fine on Windows 10! Same Java version, same VLC version, same version of vlcj, same build!
- The problem only occurs for certain videos encodings:
mp4
,mkv
, ..., whereas oldermpeg2
videos do not cause the issue! - When I play the problematic videos using the official vlcj test application, the crashes do not occur! I compared the respective code sections, but could not find a real difference in the way the stop method is being invoked
- The issue seems not to be connected to my specific personal system setup. It occurs on any Windows 11 machine I have run my application on so far
The VLC logfile does not contain any errors. The process just crashes while logs are being written to it. I was searching the Windows event viewer for errors and I could find the respective error events. Here is how they look like (it's in German unfortunately):
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:
I have tried various things like setting the video output to opengl
instead of direct3d11
, and I have also changed the respective settings in native VLC, but with no effect. Somehow I cannot get my player to use another video output module. On the other hand, I would not want to force users to make manual changes to these kind of settings anyways. I am not into video codecs, the whole native library stuff and the depths of VLC at all. I have been struggling with this for a couple of days now and don't see what could be wrong.
If the issue is with my Java code, then why does it run on my old Windows 10 machine and with older codecs? If the issue is with VLC and the installed codecs, then why does the crash not happen when I run the vlcj test application? I have installed the latest GPU drivers and I have a clean and fresh Windows 11 installation.
I managed to capture a screenshot of an error message VLC logs to the console. (1) is where I call vlcplayer.stop()
, (2) is when the vlcj event handler receives the stopped()
event. In between the native VLC throws an error (that leads to the crash, obviously):
Working code example:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import uk.co.caprica.vlcj.filefilters.swing.SwingFileFilterFactory;
import uk.co.caprica.vlcj.playerponent.EmbeddedMediaPlayerComponent;
/**
* @author Oender
*/
public class VLCJTest extends JFrame {
private static final long serialVersionUID = 1L;
private EmbeddedMediaPlayerComponent playerComponent;
/**
* Constructor
*/
public VLCJTest() {
super.setTitle("VLCJ Test (fixed)");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playerComponent = new EmbeddedMediaPlayerComponent();
initComponents();
}
/**
* Initialize & arrange components
*/
private void initComponents() {
final JPanel content = new JPanel (new BorderLayout());
content.setPreferredSize (new Dimension(400,300));
final JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(new EtchedBorder());
final JButton openButton = new JButton("Open");
openButton.setFocusable(false);
final JButton stopButton = new JButton("Stop Video");
stopButton.setFocusable(false);
// attach ActionListener
openButton.setActionCommand("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
final JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(SwingFileFilterFactory.newMediaFileFilter());
final int state = chooser.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
playerComponent.mediaPlayer().media().play(chooser.getSelectedFile().getPath());
}
}
});
// attach ActionListener
stopButton.setActionCommand("Stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
playerComponent.mediaPlayer().controls().stop();
}
});
buttonPanel.add(openButton);
buttonPanel.add(stopButton);
content.add(buttonPanel, BorderLayout.NORTH);
content.add(playerComponent, BorderLayout.CENTER);
super.setContentPane(content);
super.pack();
super.setVisible(true);
}
/**
* @param args
*/
public static void main (String[] args) {
new VLCJTest().setVisible(true);
}
}
Code example that causes the crash:
```java
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import com.sun.jna.NativeLibrary;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.filefilters.swing.SwingFileFilterFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.videosurface.ComponentVideoSurface;
/**
* @author Oender
*/
public class VLCJTest extends JFrame {
private static final long serialVersionUID = 1L;
private EmbeddedMediaPlayer player;
/**
* Constructor
*/
public VLCJTest() {
super.setTitle("VLCJ Test (crash)");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Canvas videoCanvas = new Canvas();
player = initPlayer(videoCanvas);
initComponents(videoCanvas);
}
/**
* Initialize & arrange components
* @param videoCanvas
*/
private void initComponents (final Canvas videoCanvas) {
final JPanel content = new JPanel (new BorderLayout());
content.setPreferredSize (new Dimension(400,300));
final JPanel buttonPanel = new JPanel();
buttonPanel.setBorder(new EtchedBorder());
final JButton openButton = new JButton("Open");
openButton.setFocusable(false);
final JButton stopButton = new JButton("Stop Video");
stopButton.setFocusable(false);
// attach ActionListener
openButton.setActionCommand("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
final JFileChooser chooser = new JFileChooser();
chooser.setFileFilter(SwingFileFilterFactory.newMediaFileFilter());
final int state = chooser.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
player.media().play(chooser.getSelectedFile().getPath());
}
}
});
// attach ActionListener
stopButton.setActionCommand("Stop");
stopButton.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent e) {
player.controls().stop();
}
});
buttonPanel.add(openButton);
buttonPanel.add(stopButton);
content.add(buttonPanel, BorderLayout.NORTH);
content.add(videoCanvas, BorderLayout.CENTER);
super.setContentPane(content);
super.pack();
super.setVisible(true);
}
/**
* create the EmbeddedMediaPlayer
* @param canvas
* @return
*/
private EmbeddedMediaPlayer initPlayer (final Canvas canvas) {
final MediaPlayerFactory factory = new MediaPlayerFactory();
final ComponentVideoSurface videoSurface = factory.videoSurfaces().newVideoSurface(canvas);
final EmbeddedMediaPlayer mPlayer = factory.mediaPlayers().newEmbeddedMediaPlayer();
mPlayer.videoSurface().set(videoSurface);
mPlayer.video().setAdjustVideo(true);
return mPlayer;
}
/**
* @param args
*/
public static void main (String[] args) {
NativeLibrary.addSearchPath("libvlc", "C:\\Program Files\\VideoLAN\\VLC");
new VLCJTest().setVisible(true);
}
}
Share
Improve this question
edited Mar 7 at 8:44
Mark Rotteveel
109k229 gold badges156 silver badges220 bronze badges
asked Jan 11 at 13:13
BateBate
718 bronze badges
14
- What thread are you calling stop() from? The UI thread? A callback? Crashes during stop are not unheard of with libvlc 3.x – caprica Commented Jan 11 at 14:08
- It is the "AWT-EventQueue", which is supposed to be the EDT. – Bate Commented Jan 11 at 14:26
- can't say without seeing actual code tbh. but why setVideoSurface is stopping the media player? – caprica Commented Jan 11 at 17:44
- This is the use case where I need to move the videoSurface to another GUI panel. As this is not possible during playback, I have to stop the player, set the new videoSurface and restart it again. We had discussed this here: [link] (stackoverflow/questions/75362753/…). The crash happens after the stop call. I have the same issue when just performing a regular stop. My code is quite distributed and modular, I have to think about a way to post it. But after all, there is not much more to it than shown above – Bate Commented Jan 11 at 18:35
- And what happens if you do NOT change the video surface, does it still crash? You should probably make sure that after you call stop(), which is asynchronous, that you wait for a stopped event, before switching video surface. – caprica Commented Jan 11 at 21:56
1 Answer
Reset to default 0This is not a problem in vlcj.
See https://code.videolan./videolan/vlc/-/issues/29069 for the issue in VLC.
This seems to be resolved in the latest VLC 3.x nightly build here https://artifacts.videolan./vlc-3.0/nightly-win64/20250307-0220/, which will hopefully soon result in a VLC 3.0.22 release containing the fix.
本文标签: javavideoplayerstop() causes JVM crash under Windows 11 (certain video codecs only)Stack Overflow
版权声明:本文标题:java - videoplayer.stop() causes JVM crash under Windows 11 (certain video codecs only) - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742123981a2421853.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论