vlcj-4切换播放视频时应用闪退 错误码0xC0000005问题求助
问题现象
使用vlcj切换正在播放的视频时,到预设的切换时间点应用直接退出,无异常抛出。
代码如下:
import javax.swing.JFrame; import java.awt.event.*; import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent; public class Main { private final JFrame frame; private final EmbeddedMediaPlayerComponent mediaPlayerComponent; public static void main(String[] args) { new Main(); } public Main() { frame = new JFrame("My First Media Player"); frame.setBounds(100, 100, 600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { mediaPlayerComponent.release(); System.exit(0); } }); mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); frame.add(mediaPlayerComponent); frame.setVisible(true); mediaPlayerComponent.mediaPlayer().submit(new Runnable(){ @Override public void run() { mediaPlayerComponent.mediaPlayer().media().play("E:\\Somevideo1.mkv"); } }); try { Thread.sleep(5000); } catch (InterruptedException e1) { } mediaPlayerComponent.mediaPlayer().submit(new Runnable(){ @Override public void run() { System.out.println("Reached 1"); mediaPlayerComponent.mediaPlayer().media().play("E:\\Somevideo2.mkv"); System.out.println("Reached 2"); } }); } }
运行后控制台打印了Reached 1,未执行到Reached 2的逻辑应用就已退出。
补充信息
- 崩溃和文件格式强相关:仅上一个播放的视频为.mkv格式时才会触发。从mp4切换到mkv可正常运行,从mkv切换到其他mkv或者mp4都会崩溃。
- 错误码为
Process finished with exit code -1073741819 (0xC0000005),属于内存访问违规错误。 - 查到的异常触发逻辑:
- 某线程耗尽栈空间,触发EXCEPTION_STACK_OVERFLOW异常(错误码0xC00000FD)。
- 该线程捕获了EXCEPTION_STACK_OVERFLOW异常后继续执行。
- 下一次尝试扩容栈时,系统接管进程,抛出EXCEPTION_ACCESS_VIOLATION(0xC0000005)异常并直接终止进程,无任何GUI提示。
该场景适用于从WinNT 4.0到XP的所有系统,Vista及更高版本会给用户展示错误提示,但进程依旧会被立即终止。
- 多台设备测试均可复现,可排除单设备硬件/环境问题。
- 使用libVLCSharp官方绑定编写C# WPF应用,也出现完全相同的错误。
- 添加
--verbose=2参数运行,切换视频时无额外日志输出,仅返回相同报错:The program '[12156] VLCSharpTest.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'.
原因分析
该问题本质为底层libVLC的MKV解复用模块缺陷,和上层绑定语言(Java/C#)无关,部分版本的libVLC在释放MKV媒体资源时存在内存泄漏或野指针问题,直接调用play()覆盖播放资源时会触发内存访问违规。
修复方案
- 更换libVLC版本:优先使用3.0.x稳定分支的最新小版本,避开4.0.x开发版的已知MKV切换bug。如果当前已使用3.0.x版本,可尝试降级到3.0.18或3.0.16版本测试。
- 切换前主动释放资源:不要直接调用play()覆盖上一个媒体,先执行停止+清空资源的操作:
mediaPlayerComponent.mediaPlayer().controls().stop(); mediaPlayerComponent.mediaPlayer().media().newMedia().clear(); // 再加载新视频播放 mediaPlayerComponent.mediaPlayer().media().play("新视频路径");
- 强制使用通用解复用器:启动libVLC时添加参数
--demux=avformat,替代默认的MKV专用解复用器,绕过模块本身的bug。 - 预处理MKV文件:对于封装不标准的MKV文件,用ffmpeg重新封装一次修复结构:
ffmpeg -i 输入.mkv -c copy 输出.mkv
内容的提问来源于stack exchange,提问作者Thor skipper
相关产品推荐
相关产品推荐

