기본 콘텐츠로 건너뛰기

Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기

Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기

AI 생성 이미지: Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기
AI 생성 이미지: Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기

순수 Java로 작동하는 경량 코덱 라이브러리 JCodec을 이용해 .mp4, .mov 같은 동영상 파일에서 특정 프레임을 이미지로 뽑아내는 실무용 코드를 정리합니다. Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기는 파일 목록 서비스나 업로드 파이프라인에서 썸네일 생성 자동화에 특히 유용합니다. 아래 예제는 서버 부하를 줄이도록 조건부로 동작하며, 실제 운영 환경에 바로 적용할 수 있게 구성했습니다.


1. 💡 JCodec 소개 및 Maven 설정

썸네일 생성은 JCodec의 코덱 처리 모듈과 AWT 기반 이미지 처리를 제공하는 javase 모듈을 조합해 구현합니다. 안정적인 의존성 버전을 사용하면 호환성 문제를 줄일 수 있습니다.

Maven pom.xml 의존성


<dependencies>
    <!-- JCodec Core Library (코덱 처리) -->
    <dependency>
        <groupId>org.jcodec</groupId>
        <artifactId>jcodec</artifactId>
        <version>0.2.5</version> <!-- 최신 안정화 버전 사용 권장 -->
    </dependency>

    <!-- JCodec JavaSE (AWT 유틸리티 및 이미지 처리) -->
    <dependency>
        <groupId>org.jcodec</groupId>
        <artifactId>jcodec-javase</artifactId>
        <version>0.2.5</version> <!-- Core와 동일 버전 사용 -->
    </dependency>
    
    <!-- 이미지 입출력을 위한 Java 기본 라이브러리 (ImageIO) -->
    <dependency>
        <groupId>javax.imageio</groupId>
        <artifactId>imageio-core</artifactId>
        <version>3.6.0</version>
    </dependency>
</dependencies>
        

2. 🛠️ 특정 프레임 썸네일 추출 Java 코드

아래 예제는 파일 메타 정보가 담긴 fileVO 객체를 활용해, 이미 썸네일이 존재할 경우 작업을 건너뛰어 불필요한 처리와 디스크 I/O를 줄입니다. Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기에 바로 쓸 수 있는 레시피입니다.

Java 썸네일 추출 로직


import org.jcodec.api.FrameGrab;
import org.jcodec.common.model.Picture;
import org.jcodec.awt.AWTUtil;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.*;
import java.util.concurrent.atomic.AtomicReference;

// (int frameNumber 및 FileVO fileVO 객체는 외부에서 주입되었다고 가정)

String file_path = null; 

// 썸네일 파일 이름 설정 (파일명_Thumbnail.png)
final String thumbnail_path = fileVO.getSaveFileNm() + "_Thumbnail.png";
File thumbnailFile = new File(thumbnail_path);

// 썸네일이 없으면 작업을 수행 (중복 방지)
if (!thumbnailFile.exists()) {
    
    // 1. 동영상 파일 확장자 필터 정의
    DirectoryStream.Filter filter = path -> {
        String name = path.getFileName().toString();
        // 대소문자 구별 없이 .mp4, .mov, .avi, .wmv 파일만 필터링
        return name.toLowerCase().endsWith(".mp4") 
             || name.toLowerCase().endsWith(".mov") 
             || name.toLowerCase().endsWith(".avi") 
             || name.toLowerCase().endsWith(".wmv");
    };

    Path dirName = Paths.get(fileVO.getFileSaveRout() + File.separator);

    try (DirectoryStream stream = Files.newDirectoryStream(dirName, filter)) {
        
        AtomicReference success = new AtomicReference<>(false); 
        
        stream.forEach(path -> {
            if (success.get()) return; // 이미 썸네일이 만들어졌다면 루프 중단
            
            try {
                // 2. FrameGrab을 사용하여 지정된 프레임 추출
                Picture picture = FrameGrab.getNativeFrame(
                    new File(path.toString()), frameNumber);
                
                // 3. Picture 객체를 Java BufferedImage로 변환
                BufferedImage bufferedImage = AWTUtil.toBufferedImage(picture);
                
                // 4. BufferedImage를 PNG 파일로 저장
                ImageIO.write(bufferedImage, "png", thumbnailFile);
                
                success.set(true); 
                
            } catch (Exception e) {
                System.err.println("썸네일 추출 실패: " + path.getFileName() + " - " + e.getMessage());
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// 썸네일 파일 경로를 최종 변수에 설정
file_path = thumbnailFile.exists() ? thumbnail_path : null;

3. 🔍 코드 주요 기능 설명 및 팁

  • 썸네일 존재 확인 (!thumbnailFile.exists()): 가장 기본이 되는 최적화입니다. 이미 생성된 썸네일이 있다면 비용이 큰 코덱 처리와 디스크 쓰기를 피합니다.
  • FrameGrab.getNativeFrame(): 대상 비디오 파일과 프레임 인덱스를 입력으로 받아 JCodec의 내부 표현(Picture)을 반환합니다. 정확한 프레임을 지정하려면 프레임 번호 또는 시간 기반 접근 방법을 고려하세요.
  • AWTUtil.toBufferedImage(): JCodec의 Picture를 Java 표준 이미지 객체인 BufferedImage로 변환합니다. ImageIO로 곧바로 파일 저장이 가능합니다.
  • 파일 확장자 필터: 대상 디렉터리에서 처리할 확장자(.mp4, .mov 등)만 선별해 작업 시간을 단축합니다. 필요에 따라 확장자 목록을 확장하세요.
  • 루프 제어와 상태 전파: AtomicReference로 성공 플래그를 관리하면 병렬 환경이나 스트림 반복에서 안전하게 루프를 조기 종료할 수 있습니다.

이 예제는 안정성과 효율성을 균형 있게 고려한 실무용 패턴입니다. 운영 환경에서는 파일 잠금, 동시성 제어, 예외 로깅을 보완하면 더 견고해집니다. Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기를 적용하여 동영상 업로드 워크플로우를 자동화하면 운영 비용과 개발 시간을 절감할 수 있습니다.

© 2025 칼퇴하는 개발자. 모든 권리 보유.

🚀 이 주제, 우리 서비스에 어떻게 적용할까요?

Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기
AI 생성 이미지: Java JCodec으로 동영상 썸네일(Thumbnail) 추출하기

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...