当前位置: 首页 > news >正文

ZLMediaKit流媒体服务器:不用docker -java源码部署Linux问题处理

在 Java 项目中,尤其是使用了 JavaCV 或 FFmpeg 的项目中,native(本地库)指的是与操作系统和硬件架构相关的二进制文件(即动态链接库),它们不是 Java 编写的,而是 C/C++ 等语言编译生成的。

🧩 常见的 native 文件类型


📁 在 JavaCV/FFmpeg 中常见的 native 库包括:
jniavutil
jniavcodec
jniavformat
jniavdevice
jnijava
这些都是 FFmpeg 提供的核心模块,通过 JavaCPP 封装后供 Java 调用

1 截图功能报错:

【业务】接口异常 接口接口地址:/index/api/getSnap 错误信息:Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

说明 JVM 在运行时无法找到 native 库(如 jniavutil.dll / libjniavutil.so),这通常是因为:
✅ 原因分析
Maven 打包插件未正确处理 native 文件
默认情况下,Spring Boot 的 spring-boot-maven-plugin 不会将 native 文件打包进最终的 .jar 文件。
即使你在依赖中引入了 windows-x86_64 或 linux-x86_64 的 native 包,它们也不会自动被提取并放入运行路径。
native 文件没有被释放到文件系统
JavaCPP 需要将 native 文件从 JAR 中提取到临时目录或指定目录加载。
如果这个过程失败,就会出现 UnsatisfiedLinkError。
平台不匹配
如果你在 Windows 上开发,但打包部署到了 Linux,而没有切换依赖的 <classifier>,也会导致找不到 native 文件。

配置pom文件:

  <!--JavaCV相关依赖--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.10</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>6.1.1-1.5.10</version><classifier>windows-x86_64-gpl</classifier></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>6.1.1-1.5.10</version><classifier>linux-x86_64-gpl</classifier></dependency><!-- Linux x86_64 示例 --><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg-platform</artifactId><version>6.1.1-1.5.10</version></dependency>

打包:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 强制 spring-boot 使用 ZIP layout 来打包 --><layout>ZIP</layout><includes><include><groupId>org.bytedeco</groupId></include></includes><!-- 可选:保留 system scope --><includeSystemScope>true</includeSystemScope></configuration>
</plugin>

2 linux gcc版本过低。

重新安装 devtoolset-9

要求 4.9以上

# 备份原有 repo 文件
sudo mv /etc/yum.repos.d/ /etc/yum.repos.d.bak/
sudo mkdir -p /etc/yum.repos.d/# 下载阿里云源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 可选:添加 SCL 源
sudo tee /etc/yum.repos.d/CentOS-SCLo-scl.repo << 'EOL'
[centos-sclo-rh]
name=CentOS-7 - SCLo RH
baseurl=http://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=0
enabled=1[centos-sclo-sclo]
name=CentOS-7 - SCLo SCLO
baseurl=http://mirrors.aliyun.com/centos/7/sclo/x86_64/sclo/
gpgcheck=0
enabled=1
EOL# 清理并重建缓存
sudo yum clean all
sudo yum makecache
sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-9

安装好gcc 9.0才可以执行ffmpeg

启动服务

nohup java  -Dloader.include=org.bytedeco -Dloader.explode=true -jar -Xms128m -Xmx1024m  j-media-server.jar /dev/null 2>&1 &

继续报错:

【业务】接口异常 接口接口地址:/index/api/getSnap 错误信息:Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path: /opt/rh/devtoolset-9/root/usr/lib64:/opt/rh/devtoolset-9/root/usr/lib:/opt/rh/devtoolset-9/root/usr/lib64/dyninst:/opt/rh/devtoolset-9/root/usr/lib/dyninst:/opt/rh/devtoolset-9/root/usr/lib64:/opt/rh/devtoolset-9/root/usr/lib:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path: /opt/rh/devtoolset-9/root/usr/lib64:/opt/rh/devtoolset-9/root/usr/lib:/opt/rh/devtoolset-9/root/usr/lib64/dyninst:/opt/rh/devtoolset-9/root/usr/lib/dyninst:/opt/rh/devtoolset-9/root/usr/lib64:/opt/rh/devtoolset-9/root/usr/lib:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib

解决方案:手动提取 native 文件 + 指定路径
步骤一:从 Maven 中提取 Linux 兼容的 .so 文件
你当前 pom.xml 引用了以下依赖:

<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>6.1.1-1.5.10</version>
<classifier>linux-x86_64-gpl</classifier>
</dependency>

C:\Users\你的用户名\.m2\repository\org\bytedeco\ffmpeg\6.1.1-1.5.10\
找到:

ffmpeg-6.1.1-1.5.10-linux-x86_64-gpl.jar

解压:

unzip ffmpeg-6.1.1-1.5.10-linux-x86_64-gpl.jar -d ffmpeg_native/

上传到目录:

/usr/local/zlmwebrtc/natives/

最后实在不行直接在docker 运行吧

FROM centos:8# 安装必要依赖(可选)
RUN dnf install -y java-11-openjdk ffmpeg# 创建 native 文件存放目录
COPY natives /opt/natives# 拷贝 jar 包
COPY target/j-media-server.jar /app.jar# 设置 JVM 启动参数
ENTRYPOINT ["java", \"-Dloader.include=org.bytedeco", \"-Djava.library.path=/opt/natives", \"-Xms128m", "-Xmx1024m", \"-jar", "/app.jar"]

# 构建镜像
docker build -t j-media-server .# 创建本地目录存放 native 文件(确保 libjniavutil.so 等存在)
mkdir -p ./natives# 将 Windows 上 Maven 中提取出的 .so 文件拷贝到此目录
cp ffmpeg-6.1.1-1.5.10-linux-x86_64-gpl/libjniavutil.so ./natives/
cp ffmpeg-6.1.1-1.5.10-linux-x86_64-gpl/libjniavcodec.so ./natives/
cp ffmpeg-6.1.1-1.5.10-linux-x86_64-gpl/libjniavformat.so ./natives/
...# 启动容器
docker run -d \--name jmedia \-v $(pwd)/natives:/opt/natives \-p 8899:8899\j-media-server

完美,又开始进入新的docker 的坑

http://www.dtcms.com/a/278587.html

相关文章:

  • day20 力扣235. 二叉搜索树的最近公共祖先 力扣701.二叉搜索树中的插入操作 力扣450.删除二叉搜索树中的节点
  • 8:从USB摄像头把声音拿出来--ALSA大佬登场!
  • Bash常见条件语句和循环语句
  • rk3588平台USB 3.0 -OAK深度相机适配方法
  • springboot 好处
  • [Nagios Core] 事件调度 | 检查执行 | 插件与进程
  • JAVA 设计模式 适配器
  • 八、nginx搭建,实现vue跳转nginx跳转gateway
  • Java设计模式(java design patterns)
  • 概率论与数理统计(二)
  • Maven+Spring
  • 在Maven多模块项目中进行跨模块的SpringBoot单元测试
  • 【橘子分布式】Thrift RPC(理论篇)
  • vscode 安装 esp ide环境
  • LeetCode-283. 移动零(Java)
  • 【STM32】什么在使能寄存器或外设之前必须先打开时钟?
  • Pandas-特征工程详解
  • 零基础入门Java虚拟机与单例模式:新手友好教程
  • Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(二)
  • VSCODE 选中多行 需要同时按住alt键才可以
  • ShenYu实战、问题记录
  • 记字节前端面试一道简单的算法题
  • 注解@Autowired和@Resource的区别
  • CentOS7 OpenSSL升级1.1.1t;OpenSSH 升级 9.8p1 保姆级教程
  • jenkins 流水线比较简单直观的
  • 《每日AI-人工智能-编程日报》--2025年7月14日
  • Spring Boot - Spring Boot 集成 MyBatis 分页实现 PageHelper
  • 17.Python 中的相等性比较:== vs is
  • 具身智能零碎知识点(五):VAE中对使用KL散度的理解
  • 【Java EE初阶 --- 网络原理】初识网络