JavaCV项目部署在Linux环境时Load库路径失败的问题
项目码云(Gitee)地址:https://gitee.com/banmajio/RTSPtoRTMP
项目github地址:https://github.com/banmajio/RTSPtoRTMP
个人博客:banmajio’s blog
JavaCV异常汇总 JavaCV异常汇总
问题描述
在将javacv项目部署到Linux系统中时,运行项目会报以下错误:
org.bytedeco.javacv.FrameGrabber$Exception: Failed to load classorg.bytedeco.javacv.FFmpegFrameGrabber
Caused by: java.lang.UnsatisfiedLinkError: no jniavdevice in java.library.path
Caused by: java.lang.UnsatisfiedLinkError: /root/.javacpp/cache/ffmpeg-4.2.2-1.5.3-linux-x86_64.jar/org/bytedeco/ffmpeg/linux-x86_64/libjniavdevice.so: libxcb.so.1: cannot open shared object file: No such file or directory
解决方法:
根据报错信息:Caused by: java.lang.UnsatisfiedLinkError: /root/.javacpp/cache/ffmpeg-4.2.2-1.5.3-linux-x86_64.jar/org/bytedeco/ffmpeg/linux-x86_64/libjniavdevice.so: libxcb.so.1: cannot open shared object file: No such file or directory
可知,系统找不到libxcb.so这个库文件。
有以下两种解决方式:
1.如果代码内用不到该库的功能就不去加载这个库。
根据报错信息找到FFmpegFrameGrabber和FFmpegFrameRecorder类的tryLoad()方法中的报错位置,注释掉加载的代码:
public static void tryLoad() throws Exception {
if (loadingException != null) {
throw loadingException;
} else {
try {
Loader.load(org.bytedeco.ffmpeg.global.avutil.class);
Loader.load(org.bytedeco.ffmpeg.global.swresample.class);
Loader.load(org.bytedeco.ffmpeg.global.avcodec.class);
Loader.load(org.bytedeco.ffmpeg.global.avformat.class);
Loader.load(org.bytedeco.ffmpeg.global.swscale.class);
// Register all formats and codecs
av_jni_set_java_vm(Loader.getJavaVM(), null);
avcodec_register_all();
av_register_all();
avformat_network_init();
// Loader.load(org.bytedeco.ffmpeg.global.avdevice.class);
// avdevice_register_all();
} catch (Throwable t) {
if (t instanceof Exception) {
throw loadingException = (Exception) t;
} else {
throw loadingException = new Exception("Failed to load " + FFmpegFrameGrabber.class, t);
}
}
}
}
如图,因为我的报错位置在这两行,所以直接注释掉,发现对程序功能没有造成影响,从而解决报错的问题。
2.给Linux环境中安装libxcb.so的库
根据javacv官方的回复,可以在Linux中安装这个库,从而避免报错。
原对话内容移步https://github.com/bytedeco/javacv/issues/1431
具体安装方式参考百度。