咩咩
发布于 2022-08-18 / 1655 阅读
0
0

Javacv在Windows下正常运行,在Linux上报异常~Could not initialize class org.bytedeco.javacv.FFmpegFrameGrabber

Javacv在Windows下正常运行,在Linux上报异常~Could not initialize class org.bytedeco.javacv.FFmpegFrameGrabber

1 问题描述
今天来分享一个违背Java跨平台的问题,在学习Java第一课老师肯定就是吹嘘Java如何强大,如何跨平台,如何一次编译,到处执行;本文就遇见了在本地windows环境开发没有问题,在Linux的服务器上运行各种异常,这不是有点违背Java跨平台的意思哇?
这个问题估计是我花费最长时间来解决的一个问题,前前后后估计有5个工作日左右来部署定位排查;花那么长的时间主要是因为以前没有接触过运用Javacv录制视频,测试环境部署权限又在一个兼职大佬手上,每次需要在服务器上修改点什么总是要等到他下班后才有时间,网上关于这个问题的解答也确实不尽人意,总结主要了两个原因:
一:依赖的Javacv版本冲突或者版本不对;
二:少部分开发人员说服务器环境缺少相关文件配置。

2021/8/12 上午9:24:29java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacv.FFmpegFrameGrabber
2021/8/12 上午9:24:29 at com.ccct.service.impl.CameraServiceImpl.grabberRecorder(CameraServiceImpl.java:117) ~[classes!/:0.0.1-SNAPSHOT]
2021/8/12 上午9:24:29 at com.ccct.service.impl.CameraServiceImpl.startRecord(CameraServiceImpl.java:68) ~[classes!/:0.0.1-SNAPSHOT]
2021/8/12 上午9:24:29 at com.ccct.controller.CameraController.startRecord(CameraController.java:41) ~[classes!/:0.0.1-SNAPSHOT]
2021/8/12 上午9:24:29 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_111-internal]
2021/8/12 上午9:24:29 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_111-internal]
2021/8/12 上午9:24:29 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_111-internal]
2021/8/12 上午9:24:29 at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_111-internal]
2021/8/12 上午9:24:29 at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.7.jar!/:5.3.7]
2021/8/12 上午9:24:29 at org

2 心经路程
正如上面描述的第一种情况;很无赖每次修改个依赖版本都需要将代码提交发布后才能验证,然而Javacv的相关版本又比较多从0.8版本到最新的1.5.6我都有尝试还是不行;麻烦的是每个版本之间相关对应的依赖也是不尽相同毫无规律查看对应版本地址;只是不同的版本可能报异常不同;低版本报异常如下:

java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.javacpp.avutil
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at org.bytedeco.javacpp.Loader.load(Loader.java:390)
    at org.bytedeco.javacpp.Loader.load(Loader.java:358)
    at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2539)
    at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:383)
    at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:377)
    at com.example.Application.convert(Application.java:53)
    at com.example.Application.run(Application.java:103)
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:674)
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:693)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:322)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:969)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:958)
    at com.example.Application.main(Application.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)

3 问题解决
1.网上有一个哥们儿说 inux环境缺少libXV.so1文件,安装即可;
但是按照后还是不行;
2.无赖只能去对应的托管的github上看看,居然也有老外遇见相似的问题,官方给出的答复截图如下:需要安装libxcb.so这个库
ps:以前遇见英文的相关文档基本上都是跳过,因为这个问题中文的解决方式我基本上看完了(_)
在这里插入图片描述
原文链接点这儿

4 问题总结
给服务器安装上libxcb后问题迎刃而解,终于将这个问题跨域过去,最后自己选择的版本是1.5.5

 <dependency>
    <groupId>org.bytedeco</groupId>
     <artifactId>javacv-platform</artifactId>
     <version>1.5.5</version>
 </dependency>
 <dependency>
       <groupId>org.bytedeco</groupId>
       <artifactId>opencv-platform</artifactId>
       <version>4.5.1-1.5.5</version>
 </dependency>

评论