| | |
| | | import com.tencent.cloud.cos.util.Jackson; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.apache.commons.collections4.CollectionUtils; |
| | | import org.bytedeco.javacv.*; |
| | | import org.bytedeco.opencv.global.opencv_imgproc; |
| | | import org.bytedeco.opencv.opencv_core.Mat; |
| | | import org.bytedeco.opencv.opencv_core.Size; |
| | | import org.springframework.mock.web.MockMultipartFile; |
| | | //import org.bytedeco.javacv.*; |
| | | //import org.bytedeco.opencv.global.opencv_imgproc; |
| | | //import org.bytedeco.opencv.opencv_core.Mat; |
| | | //import org.bytedeco.opencv.opencv_core.Size; |
| | | //import org.springframework.mock.web.MockMultipartFile; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.*; |
| | | import java.net.URL; |
| | |
| | | * @throws Exception 处理异常 |
| | | */ |
| | | public MultipartFile captureVideoCoverAsMultipart(String videoUrl, Integer width, Integer height) throws Exception { |
| | | // 设置默认宽高 |
| | | int targetWidth = width != null && width > 0 ? width : 800; |
| | | int targetHeight = height != null && height > 0 ? height : 600; |
| | | |
| | | // 生成唯一文件名(用于MultipartFile的原始文件名) |
| | | String fileName = UUID.randomUUID().toString() + ".jpg"; |
| | | |
| | | // 使用内存流处理图片,避免临时文件 |
| | | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| | | FFmpegFrameGrabber grabber = null; |
| | | |
| | | try { |
| | | // 初始化视频抓取器 |
| | | grabber = new FFmpegFrameGrabber(videoUrl); |
| | | grabber.start(); |
| | | |
| | | // 定位到第一秒 |
| | | grabber.setTimestamp(1000000); // 1秒 = 1,000,000微秒 |
| | | |
| | | // 获取视频帧 |
| | | Frame frame = grabber.grabImage(); |
| | | if (frame == null) { |
| | | throw new RuntimeException("无法获取视频帧,可能视频格式不支持或URL无效"); |
| | | } |
| | | |
| | | // 转换为Mat并调整尺寸 |
| | | OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | Mat mat = converter.convert(frame); |
| | | Mat resizedMat = new Mat(); |
| | | opencv_imgproc.resize(mat, resizedMat, new Size(targetWidth, targetHeight)); |
| | | |
| | | // 将处理后的帧写入内存流 |
| | | Java2DFrameConverter java2dConverter = new Java2DFrameConverter(); |
| | | ImageIO.write( |
| | | java2dConverter.getBufferedImage(converter.convert(resizedMat)), |
| | | "jpg", |
| | | outputStream |
| | | ); |
| | | |
| | | // 将内存流转换为MultipartFile |
| | | ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); |
| | | return new MockMultipartFile( |
| | | "file", // 表单字段名(可自定义) |
| | | fileName, // 原始文件名 |
| | | "image/jpeg", // 文件类型 |
| | | inputStream // 文件流 |
| | | ); |
| | | } finally { |
| | | // 释放资源 |
| | | if (grabber != null) { |
| | | try { |
| | | grabber.stop(); |
| | | grabber.release(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | outputStream.close(); |
| | | } |
| | | // // 设置默认宽高 |
| | | // int targetWidth = width != null && width > 0 ? width : 800; |
| | | // int targetHeight = height != null && height > 0 ? height : 600; |
| | | // |
| | | // // 生成唯一文件名(用于MultipartFile的原始文件名) |
| | | // String fileName = UUID.randomUUID().toString() + ".jpg"; |
| | | // |
| | | // // 使用内存流处理图片,避免临时文件 |
| | | // ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| | | // FFmpegFrameGrabber grabber = null; |
| | | // |
| | | // try { |
| | | // // 初始化视频抓取器 |
| | | // grabber = new FFmpegFrameGrabber(videoUrl); |
| | | // grabber.start(); |
| | | // |
| | | // // 定位到第一秒 |
| | | // grabber.setTimestamp(1000000); // 1秒 = 1,000,000微秒 |
| | | // |
| | | // // 获取视频帧 |
| | | // Frame frame = grabber.grabImage(); |
| | | // if (frame == null) { |
| | | // throw new RuntimeException("无法获取视频帧,可能视频格式不支持或URL无效"); |
| | | // } |
| | | // |
| | | // // 转换为Mat并调整尺寸 |
| | | // OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | // Mat mat = converter.convert(frame); |
| | | // Mat resizedMat = new Mat(); |
| | | // opencv_imgproc.resize(mat, resizedMat, new Size(targetWidth, targetHeight)); |
| | | // |
| | | // // 将处理后的帧写入内存流 |
| | | // Java2DFrameConverter java2dConverter = new Java2DFrameConverter(); |
| | | // ImageIO.write( |
| | | // java2dConverter.getBufferedImage(converter.convert(resizedMat)), |
| | | // "jpg", |
| | | // outputStream |
| | | // ); |
| | | // |
| | | // // 将内存流转换为MultipartFile |
| | | // ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); |
| | | // return new MockMultipartFile( |
| | | // "file", // 表单字段名(可自定义) |
| | | // fileName, // 原始文件名 |
| | | // "image/jpeg", // 文件类型 |
| | | // inputStream // 文件流 |
| | | // ); |
| | | // } finally { |
| | | // // 释放资源 |
| | | // if (grabber != null) { |
| | | // try { |
| | | // grabber.stop(); |
| | | // grabber.release(); |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // outputStream.close(); |
| | | // } |
| | | return null; |
| | | } |
| | | |
| | | |