개발자공부 (2021.11~현재)/Java

Jcodec과 thumbnailator를 이용한 썸네일 뽑기

purplecloud 2022. 11. 1. 15:31

클라이언트가 영상을 업로드하면 해당 영상의 썸네일을 뽑아서 대표 이미지로 사용하고자 함.

 

- dependencies 추가 (gradle)

// thumbnailator
implementation group: 'net.coobird', name: 'thumbnailator', version: '0.4.1'

//jcodec
implementation 'org.jcodec:jcodec:0.2.5'
implementation 'org.jcodec:jcodec-javase:0.2.5'

 

import net.coobird.thumbnailator.Thumbnails;
import org.jcodec.api.FrameGrab;
import org.jcodec.api.JCodecException;
import org.jcodec.common.io.NIOUtils;
import org.jcodec.common.model.Picture;
import org.jcodec.scale.AWTUtil;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ThumbnailExtract {

    public static void getVideoThumbnailImg(File file, File thumbnailDest, int frameNum) throws IOException, JCodecException {
        FrameGrab grab = FrameGrab.createFrameGrab(NIOUtils.readableChannel(file));
        grab.seekToSecondPrecise(frameNum);
        Picture picture = grab.getNativeFrame();

        BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
        ImageIO.write(Thumbnails.of(bufferedImage).width(500).asBufferedImage(), "jpg", thumbnailDest);
    }

}

 

메소드에서 전달해주는 file 은 해당 영상의 파일을 전달해주면 되고 thumbnailDest는 뽑아준 썸네일을 저장해줄 곳이다.

thumbnails를 사용해서 썸네일 사진의 넓이를 500으로 통일해줬는데 원본파일보다 작은 용량의 사진이 저장되어

캐싱 작업없이도 속도를 높힐 수 있었다.

 

seekToSecondPrecise라는 메소드 대신

grab.seekToFramePrecise 라는 메소드를 사용해도되는데 이 메소드는 전달받은 숫자의 순서에 해당하는 프레임을 전달해준다.

 

 

- jcodec

https://www.javadoc.io/static/org.jcodec/jcodec/0.2.4/org/jcodec/api/FrameGrab.html