java保存视频并保存第一帧图片

<dependency>
		<groupId>org.bytedeco</groupId>
		<artifactId>javacv-platform</artifactId>
		<version>1.4.4</version>
	</dependency>
	
	<dependency>
		<groupId>org.bytedeco.javacpp-presets</groupId>
		<artifactId>ffmpeg-platform</artifactId>
		<version>4.0.2-1.4.3</version>
	</dependency>


/**
 * 功能描述: 保存小视频
 *
 */
@RequestMapping(value = "/saveVideo", method = RequestMethod.POST)
@ResponseBody
public void saveVideo(@RequestParam(value="file",required=false) MultipartFile file) {
    try {
        InputStream inputStream = file.getInputStream();
        // todo 返回小视频url 和 图片url
        Map map = picBusiness.uploadVideo(request, inputStream);
    } catch (Exception e) {
          e.printStackTrace();
    }
    return null;
}


public void uploadVideo(InputStream inputStream){
    File saveDirectory = new File("文件夹路径");
    // 创建文件夹
    if (!saveDirectory.exists() && !saveDirectory.isDirectory()) {
        boolean bl = saveDirectory.mkdirs();
    }
    // 转byte
    byte[] b = readAsBytes(inputStream);
    OutputStream out = null;
    try{
        out = new FileOutputStream(filePath.concat(fileName));
        out.write(b);
        out.flush();

        // 第一帧图片路径
        grabberVideoFramer(文件名, 路径);
   		 }catch (Exception e){
        e.printStackTrace();
    	}finally {
        try {
            if(null != out){
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 二进制读取
public static byte[] readAsBytes(InputStream in) {
    byte[] buffer = new byte[0];
    try {
        buffer = new byte[in.available()];
    } catch (IOException e) {
        e.printStackTrace();
    }
 
    try {
        in.read(buffer);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (null != in) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return buffer;
}



public String grabberVideoFramer(String videoFileName, String videoPath, Map map){

    //最后获取到的视频的图片的路径
   	String videPicture="";
    String pivStr = "";
    //Frame对象
    Frame frame = null;
    //标识
    int flag = 0;
    try {
    
        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath.concat(videoFileName));
        fFmpegFrameGrabber.start();
        //获取视频总帧数
        int ftp = fFmpegFrameGrabber.getLengthInFrames();
        String rotate = fFmpegFrameGrabber.getVideoMetadata("rotate");
        while (flag <= ftp) {
            frame = fFmpegFrameGrabber.grabImage();
            opencv_core.IplImage src = null;

            if (frame != null && flag==1) {
				// 视频旋转调整
                if(StringUtils.isNotBlank(rotate)){
                    OpenCVFrameConverter.ToIplImage converter =new OpenCVFrameConverter.ToIplImage();
                    src =converter.convert(frame);
                    frame =converter.convert(rotate(src, Integer.valueOf(rotate)));
                }
                
                //文件储存对象
                File outPut = new File(文件绝对路径+文件名);

                BufferedImage bufferedImage = FrameToBufferedImage(frame);
                int width = bufferedImage.getWidth();
                int height = bufferedImage.getHeight();
				
				// 图片大小限制
                if(width > height){
                        // 高宽比
                        double proportion = (double)height/(double)width;
                        width = 600;
                        BigDecimal bd=new BigDecimal(width * proportion).setScale(0, BigDecimal.ROUND_HALF_UP);
                        height = bd.intValue();
                    }
				// 图片压缩
                BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
                bi.getGraphics().drawImage(bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                        0, 0, null);
                ImageIO.write(bi, "jpg", outPut);
                break;
            }
            flag++;
        }

        fFmpegFrameGrabber.stop();
        fFmpegFrameGrabber.close();
    } catch (Exception e) {
        throw new BusinessException("grabberVideoFramer 异常", e);
    }
    return pivStr;
}

public static BufferedImage FrameToBufferedImage(Frame frame) {
    //创建BufferedImage对象
    Java2DFrameConverter converter = new Java2DFrameConverter();
    BufferedImage bufferedImage = converter.getBufferedImage(frame);
    return bufferedImage;
}

public static opencv_core.IplImage rotate(opencv_core.IplImage src, int rotate) {
    opencv_core.IplImage img = opencv_core.IplImage.create(src.height(), src.width(), src.depth(), src.nChannels());
    opencv_core.cvTranspose(src, img);
    opencv_core.cvFlip(img, img, rotate);
    return img;
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要获取 GIF 图片第一保存到本地,可以使用 Glide 或者 BitmapFactory 进行处理,然后将 Bitmap 保存图片文件。 使用 Glide: ```java Glide.with(context) .asBitmap() .load(gifUrl) .diskCacheStrategy(DiskCacheStrategy.DATA) .addListener(new RequestListener<Bitmap>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) { // 处理第一图片 saveBitmapToFile(resource, filePath); return false; } }) .submit(); ``` 使用 BitmapFactory: ```java // 获取 GIF 图片的字节数组 byte[] gifBytes = getGifBytes(gifUrl); if (gifBytes != null) { // 解码字节数组,获取第一图片 Bitmap bitmap = BitmapFactory.decodeByteArray(gifBytes, 0, gifBytes.length, null); // 处理第一图片 saveBitmapToFile(bitmap, filePath); } ``` 其中,`getGifBytes` 方法可以使用网络请求等方式获取 GIF 图片的字节数组,`saveBitmapToFile` 方法用于将 Bitmap 保存图片文件: ```java public static void saveBitmapToFile(Bitmap bitmap, String filePath) { if (bitmap == null || TextUtils.isEmpty(filePath)) { return; } File file = new File(filePath); if (file.exists()) { file.delete(); } try { FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 这里将 Bitmap 以 PNG 格式保存,可以根据需要修改为 JPG 等其他格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值