Java上传并解码视频文件至minio,加自动截取视频封面

文章目录


前言

        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的教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值