当前位置: 首页 > news >正文

使用jcodec库,访问网络视频提取封面图片上传至oss

  注释部分为FFmpeg(确实方便但依赖太大,不想用)

 
package com.zuodou.upload;


import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.zuodou.oss.OssProperties;
//import org.bytedeco.javacv.FFmpegFrameGrabber;
//import org.bytedeco.javacv.Frame;
//import org.bytedeco.javacv.Java2DFrameConverter;
import org.jcodec.api.FrameGrab;
import org.jcodec.common.io.FileChannelWrapper;
import org.jcodec.common.io.NIOUtils;
import org.jcodec.common.io.SeekableByteChannel;
import org.jcodec.common.model.Picture;
import org.jcodec.scale.AWTUtil;


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.channels.FileChannel;


/**
* 截取视频图片
* @ClassName:  FrameGrabberKit   
*/
public class FrameVideoUtlis {


    /**
     * 获取指定视频的帧并保存为图片至指定目录
     * @param videofile  源视频文件路径
     * @param framefile  截取帧的图片存放路径 例:F:\hfkjrecorder\target\4.jpg
     * @throws Exception
     */
	public  void getVedioImg(String videofile, String framefile,OSS ossClient){
	    //截取封面图
		try {
            URL url = new URL(videofile);
            URLConnection connection = url.openConnection();
            InputStream inputStream = connection.getInputStream();

            // 创建临时文件
            File tempFile = File.createTempFile("video", ".mp4");

            // 将 InputStream 内容写入临时文件
            try (RandomAccessFile tempFileStream = new RandomAccessFile(tempFile, "rw")) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    tempFileStream.write(buffer, 0, bytesRead);
                }
            }

            // 将临时文件转换为 SeekableByteChannel
            SeekableByteChannel channel = NIOUtils.readableChannel(tempFile);

            // 从视频流中抓取第一帧
            Picture grab = FrameGrab.getFrameFromChannel(channel,1);
            // 将视频帧转换为BufferedImage
            BufferedImage image = AWTUtil.toBufferedImage(grab);
            // 生成的预览图
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(image, "jpg", outputStream);


//            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videofile);
//            grabber.start();
//            // 提取封面图像
//            Java2DFrameConverter converter = new Java2DFrameConverter();
//            Frame frame = grabber.grabImage();
//            BufferedImage image = converter.convert(frame);
//            // 不再需要保存为本地文件,直接上传到阿里云 OSS
//            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//            ImageIO.write(image, "jpg", outputStream);

            // 保存封面图像
            byte[] imageBytes = outputStream.toByteArray();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(imageBytes.length);
            PutObjectRequest putObjectRequest = new PutObjectRequest(OssProperties.BUCKET_NAME, framefile.substring(1), new ByteArrayInputStream(imageBytes), metadata);

            // 创建PutObject请求。
            ossClient.putObject(putObjectRequest);
//            grabber.stop(); // 确保在代码块结束时释放资源
            tempFile.delete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	 }


}



相关文章:

  • 苹果Siri升级遇阻,国行iPhone或将引入阿里、百度AI自救
  • ‌PLC数据类型和‌C#数据类型的数据类型映射表
  • Windows操作系统日常操作--网络通信
  • Git清理本地残留的、但已经在服务器上被删除的分支
  • 计算机毕业设计SpringBoot+Vue.js医院药品管理系统(源码+文档+PPT+讲解)
  • Pygame实现动画效果2-1
  • JavaScript数据类型转换
  • Pandas实现Excel的vlookup并且在指定列后面输出
  • STL——list的介绍和模拟实现
  • 【新手入门】SQL注入之getshell(木马)
  • Java之JVM内存模型
  • Linux - 进程
  • 运维Zabbix面试题及参考答案
  • 一、数据库 MySQL 基础学习 (上)
  • FineBI_实现求当日/月/年回款金额分析
  • LeetCode 2588.统计美丽子数组数目:前缀和 + 位运算(异或) + 哈希表
  • 自动化同步多服务器数据库表结构
  • 2025年渗透测试面试题总结-字某某动-安全研究实习生(二面)(题目+回答)
  • STL:C++的超级工具箱(一)
  • linux 系统内核查询
  • 网络营销方案的制定思路/惠州seo报价
  • hbuider 做网站/百度sem推广具体做什么
  • 空壳网站清理通知/百度推广账号登录
  • 网站建设贵阳/做网站的费用
  • 久久建筑网会员登陆中心/关键词seo如何优化
  • 天津市工程建设项目报建网站/凡科建站官网