import cv2
import os
from skimage.metrics import structural_similarity as ssim

# ===== 설정 =====
VIDEO_PATH = "recorded.webm"   # 입력 영상 파일
OUTPUT_DIR = "frames"          # 결과 프레임 저장 폴더
IMAGE_FORMAT = "png"           # 'png' or 'jpg' / 'jpeg'
SSIM_THRESHOLD = 0.95          # 0.97~0.99 정도 권장 (값↑ = 더 엄격)
RESIZE_WIDTH = 320             # 비교용 프레임 너비(작게 줄여서 속도↑)
# =================

os.makedirs(OUTPUT_DIR, exist_ok=True)

cap = cv2.VideoCapture(VIDEO_PATH)
if not cap.isOpened():
    print("비디오 파일을 열 수 없습니다:", VIDEO_PATH)
    exit(1)

fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f"[INFO] FPS: {fps}, 총 프레임 수: {frame_count}")

prev_gray_small = None
saved_idx = 0
frame_idx = 0

# 저장 품질 옵션 설정
img_ext = IMAGE_FORMAT.lower()
if img_ext in ("jpg", "jpeg"):
    # JPEG: 높은 퀄리티 (0~100, 기본 95 정도 추천)
    imwrite_params = [cv2.IMWRITE_JPEG_QUALITY, 95]
elif img_ext == "png":
    # PNG: 압축 레벨 (0~9, 0이 가장 빠르고 무손실, 용량 큼)
    imwrite_params = [cv2.IMWRITE_PNG_COMPRESSION, 0]
else:
    imwrite_params = []  # 기타 포맷은 기본 옵션

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # ---- 비교용으로 작은 그레이스케일 이미지 만들기 (품질에는 영향 X) ----
    h, w = frame.shape[:2]
    new_w = RESIZE_WIDTH
    new_h = int(h * (new_w / w))
    frame_small = cv2.resize(frame, (new_w, new_h), interpolation=cv2.INTER_AREA)
    gray_small = cv2.cvtColor(frame_small, cv2.COLOR_BGR2GRAY)
    # ---------------------------------------------------

    if prev_gray_small is None:
        # 첫 프레임은 무조건 저장 (원본 프레임 그대로)
        save_path = os.path.join(OUTPUT_DIR, f"frame_{saved_idx:06d}.{IMAGE_FORMAT}")
        cv2.imwrite(save_path, frame, imwrite_params)
        print(f"[SAVE] 첫 프레임 저장 -> {save_path}")
        prev_gray_small = gray_small
        saved_idx += 1
    else:
        # 이전에 저장된 프레임과 SSIM 비교
        score = ssim(prev_gray_small, gray_small)

        if score < SSIM_THRESHOLD:
            # 충분히 달라졌으면 “새로운 프레임”으로 판단하고 저장
            save_path = os.path.join(OUTPUT_DIR, f"frame_{saved_idx:06d}.{IMAGE_FORMAT}")
            cv2.imwrite(save_path, frame, imwrite_params)
            print(f"[SAVE] {frame_idx:06d}번 프레임 저장 (SSIM={score:.4f}) -> {save_path}")
            prev_gray_small = gray_small
            saved_idx += 1
        else:
            # 너무 비슷하면(중복/유사 프레임) 건너뜀
            pass

    frame_idx += 1

cap.release()
print(f"[DONE] 저장된 프레임 수: {saved_idx}")
print("폴더:", os.path.abspath(OUTPUT_DIR))
