You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),属于内存访问违规错误。
  • 查到的异常触发逻辑:
  1. 某线程耗尽栈空间,触发EXCEPTION_STACK_OVERFLOW异常(错误码0xC00000FD)。
  2. 该线程捕获了EXCEPTION_STACK_OVERFLOW异常后继续执行。
  3. 下一次尝试扩容栈时,系统接管进程,抛出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()覆盖播放资源时会触发内存访问违规。

修复方案
  1. 更换libVLC版本:优先使用3.0.x稳定分支的最新小版本,避开4.0.x开发版的已知MKV切换bug。如果当前已使用3.0.x版本,可尝试降级到3.0.18或3.0.16版本测试。
  2. 切换前主动释放资源:不要直接调用play()覆盖上一个媒体,先执行停止+清空资源的操作:
mediaPlayerComponent.mediaPlayer().controls().stop();
mediaPlayerComponent.mediaPlayer().media().newMedia().clear();
// 再加载新视频播放
mediaPlayerComponent.mediaPlayer().media().play("新视频路径");
  1. 强制使用通用解复用器:启动libVLC时添加参数--demux=avformat,替代默认的MKV专用解复用器,绕过模块本身的bug。
  2. 预处理MKV文件:对于封装不标准的MKV文件,用ffmpeg重新封装一次修复结构:
ffmpeg -i 输入.mkv -c copy 输出.mkv

内容的提问来源于stack exchange,提问作者Thor skipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:39:04