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

contos7 升级太累了。不要用

我最后的方案是:DOCKER

ZLMediaKit流媒体服务器WebRTC页面显示:使用docker部署-优快云博客

如果你要挑战,用先升级GCC.再升级ffmpeg,再安装。

在 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 的坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值