文章目录
前言
minio是一个免费的资源服务器,可以在里面存储视频,图像等各种资源,通过url访问,以下是搭建minio服务器并且上传视频资源的过程
一、docker搭建minio
1.CentOS安装docker
1.1.卸载(可选)
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
1.2.安装docker
首先需要大家虚拟机联网,安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
# 设置docker镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
然后输入命令:
yum install -y docker-ce
docker-ce为社区免费版本。稍等片刻,docker即可安装成功。
1.3.启动docker
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
2.搭建minio
搜索minio镜像
docker search minio
拉取镜像
docker pull bitnami/minio
查看下载好的镜像
创建数据卷目录,并提升权限
mkdir -p /minio/data
chmod -R 777 /minio/data
根据镜像创建一个minio容器,如果报错端口占用,则换个端口就行
docker run -it -d /
--name minio /
-p 9000:9000 -p 9001:9001 /
-v /minio/data:/data /
-e MINIO_ROOT_USER="root" /
-e MINIO_ROOT_PASSWORD="minio236547" /
bitnami/minio:latest
参数说明
● -it:-i 表示以交互模式运行容器,-t 表示为容器重新分配一个伪输入终端,两个参数必须结合使用才能启动一个容器
● -d:以守护进程方式来启动容器,这也是常用参数,防止阻塞当前窗口
● -p 9000:9000:MinIO 服务会暴露 9000 端口来对外提供对象访问,也就是通过此端口运行的服务来访问资源
● -p 9001:9001:MinIO 服务会提供一个可视化管理系统,默认在 9001 端口运行
● -v /minio/data:/data:挂载数据卷,将 minio 容器内存储的文件映射到宿主机
● -e MINIO_ROOT_USER=“minio_root”:设置 root 用户名
● -e MINIO_ROOT_PASSWORD=“minio_123456”:设置 root 的密码,长度至少 8
查看 minio 容器的信息
docker ps
可以看到容器的 ID,所使用的的镜像,运行状态,端口等信息
开放安全组端口
minio 服务用到了 9000 和 9001 端口,如果使用的是云服务器,需要在安全组中开放端口
访问minio
网址中输入域名加端口即可进入minio 如:
http://192.168.150.102:9001/
创建video桶和video-cover,存储视频资源和视频封面
二、使用步骤
1.引入库
代码如下:
// 连接操作minio的依赖 <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency>
// 转码视频文件所用依赖 <dependency> <groupId>ws.schild</groupId> <artifactId>jave-all-deps</artifactId> <version>3.3.1</version> </dependency>
// 工具包 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool-all.version}</version> </dependency>
写入配置:
minio: url: http://192.168.150.102:9000 access.name: root access.secret: minio236547 bucket.video: video bucket.cover: video-cover
2.上传视频文件
代码如下:
public class UploadVideo {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucket.video}")
private String videoBucket;
@Value("${minio.bucket.cover}")
private String coverBucket;
@Value("${minio.url}")
private String filePath;
public void upload() throws IOException {
// 读取视频文件
File videoFile = new File("C:\\Users\\tiz\\Pictures\\食品风险分级演示视频.mp4");
// 判断文件格式
if (!FileTypeUtil.getType(videoFile).equals("mp4")) {
videoFile.delete();
System.out.println("不是视频文件");
} else {
System.out.println("文件无问题");
}
// 获取视频名称
String videoName = videoFile.getName();
videoName = videoName.substring(videoName.lastIndexOf("."));
// 创建视频封面的临时文件
String filePath = Files.createTempDirectory(".tmp").toString();
String coverFileName = videoName+ UUID.randomUUID().toString().substring(0, 8) + ".jpg";
File coverFile = new File(filePath, coverFileName);
// 视频封面上传至minio的格式
String imgContentType = "image/jpeg";
// 用schild工具包截取视频第一帧图片作为视频封面
ScreenExtractor screenExtractor = new ScreenExtractor();
MultimediaObject multimediaObject = new MultimediaObject(videoFile);
screenExtractor.renderOneImage(multimediaObject, -1, -1, 1000, coverFile, 1);
// 视频封面上传至minio
minioClient.putObject(
PutObjectArgs.builder().bucket(coverBucket).object(coverFileName)
.stream(new FileInputStream(coverFile), -1, 10485760)
.contentType(imgContentType)
.build());
System.out.println("视频封面上传成功!");
// 获取视频基础信息
VideoInfo videoInfo = multimediaObject.getInfo().getVideo();
// 校验视频编码格式是否为h264,如果不是则进行转码
String rightFormat = "h264";
if (!rightFormat.equals(videoInfo.getDecoder())) {
String outPutForMatType = "mp4";
VideoAttributes videoAttributes = new VideoAttributes();
String targetFileName = "target";
File target = new File(filePath, targetFileName);
videoAttributes.setCodec(rightFormat);
AudioAttributes audio = new AudioAttributes();
EncodingAttributes attrs = new EncodingAttributes();
attrs.setOutputFormat(outPutForMatType);
attrs.setAudioAttributes(audio);
attrs.setVideoAttributes(videoAttributes);
Encoder encoder = new Encoder();
// 转码
encoder.encode(multimediaObject, target, attrs);
videoFile = target;
System.out.println("转码成功!");
}
String contentType = "video/mp4";
FileInputStream inputStream = new FileInputStream(videoFile);
// 上传视频
videoName = videoName+ UUID.randomUUID().toString().substring(0, 8) + ".mp4";
minioClient.putObject(
PutObjectArgs.builder().bucket(videoBucket).object(videoName)
.stream(inputStream, -1, 10485760)
.contentType(contentType)
.build());
System.out.println("视频上传成功!");
}
}
运行测试代码,上传成功:
总结
以上就是docker搭建minio的过程和Java截取视频封面,给视频转码,上传视频与封面至minio的教程