
Bug记录(持续更新)
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();
}
然后一个个查看,最后发现缺少了一个MFPlat.dll的依赖,于是上度娘上搜了一下,发现该依赖是因为WindowServer服务器没有开启音频基础而导致的。于是打开音频基础后重启服务器,再次启动程序,发现一切正常。
结论
当javacv程序部署在windowsServer服务器上时,需要安装媒体基础。
Docker
服务器运行docker命令失败
问题描述
这个问题很宽泛,导致的原因会有很多,我碰到该Bug是因为磁盘被占满了,然后通过df等相关命令进行排查,发现/var/docker目录占用空间最大,最后详细排查,发现是opentsdb的日志文件太大,导致磁盘满了,修改opentsdb的日志级别或者设置docker的json-file都可以解决问题。
设置docker的日志配置可参考Docker限制日志大小
结论
安装docker时,尽量配置docker日志相关配置。