Javacv

WindowsServer2012无法使用

问题描述

笔者在工作过程中需要在B端播放视频,所以采用ffmpeg和javacv写了一个视频转码程序,以便于在B端无插件播放视频,该程序在windows开发环境,win7,win10,centos7.6都是正常的,但是因为业务中需要将视频映射到公网中,所以在公网服务器上部署了一个上层网关,因为该网关需要windows系统,所以服务器的系统为windowServer,但是将该程序部署到服务器后,一直报错,说找不到jniavcodec.dll依赖错误。

问题排查

遇到该问题后,首先想到的是,是不是依赖问题

        <properties>
            <javacv.version>1.5.6</javacv.version>
            <ffmpeg.windows.version>4.4-1.5.6</ffmpeg.windows.version>
            <ffmpeg.linux.version>4.4-1.5.6</ffmpeg.linux.version>
        </properties>
        
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>${javacv.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>${ffmpeg.windows.version}</version>
            <classifier>windows-x86_64</classifier>
        </dependency>

        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>${ffmpeg.linux.version}</version>
            <classifier>linux-x86_64</classifier>
        </dependency>

但是依赖是正常的,没有排除window的依赖,所以依赖是没有问题的。因为每个版本的javacv的变动都非常大,所以想是不是该版本不支持winServer系统,然后就开始降版本,但是降了几个版本,问题都没有解决,然后就决定暂时放弃这个想法,看看是不是其他方面的问题,于是就使用一个github的软件开始排除dll依赖问题(因为服务器上的问题已经解决了,所以以下图片是在开发环境进行步骤复现的)。

        try {
            String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
            log.info("初始化ffmpeg资源成功");
        } catch (UnsatisfiedLinkError e) {
            log.info("初始化ffmpeg失败");
            // 用于排查缺少的dll
            String path = Loader.cacheResource(org.bytedeco.ffmpeg.ffmpeg.class, "windows-x86_64/jniavcodec.dll").getPath();
            new ProcessBuilder("D:/app/DependenciesGui.exe", path).start().waitFor();
        }

image-20220915101858346

然后一个个查看,最后发现缺少了一个MFPlat.dll的依赖,于是上度娘上搜了一下,发现该依赖是因为WindowServer服务器没有开启音频基础而导致的。于是打开音频基础后重启服务器,再次启动程序,发现一切正常。

image-20220915102932568

结论

当javacv程序部署在windowsServer服务器上时,需要安装媒体基础。

Docker

服务器运行docker命令失败

问题描述

这个问题很宽泛,导致的原因会有很多,我碰到该Bug是因为磁盘被占满了,然后通过df等相关命令进行排查,发现/var/docker目录占用空间最大,最后详细排查,发现是opentsdb的日志文件太大,导致磁盘满了,修改opentsdb的日志级别或者设置docker的json-file都可以解决问题。
设置docker的日志配置可参考Docker限制日志大小

结论

安装docker时,尽量配置docker日志相关配置。