광고 자리 모집 중 · 제휴 문의

Gemini 멀티모달 비디오 이해로 장시간 영상 분석하기: 분석가와 리서처를 위한 타임스탬프 이벤트 추출 실무 가이드

365Finds Editorial
Wiki 문서 11,430편 수록

내 AI에서 365 Wiki 사용하기

아래 프롬프트를 복사해 평소 사용하는 AI에 붙여넣고 바로 질문하세요.

전체 Skill 다운로드

먼저 프롬프트로 체험해 보세요. 365 Wiki를 자주 쓴다면 전체 365Wiki Skill을 설치해 매번 붙여넣는 수고를 줄일 수 있습니다. 평소 쓰는 AI가 없다면 Gemini나 Microsoft Copilot 웹 버전도 사용할 수 있습니다.

콘텐츠 분석가, UX 리서처, 시장 조사 전문가는 사용성 테스트(UT), 포커스 그룹 인터뷰(FGI), 학술 강연, 실적 발표회, 웨비나 등 수 시간에 달하는 방대한 영상 기록을 상시 다룹니다. 기존 워크플로에서는 긴 영상에서 구조화된 이벤트 로그를 추출하기 위해 여러 도구를 파편적으로 조합해야 했습니다. 즉, 자동 음성 인식(ASR)으로 텍스트를 전사하고, 컴퓨터 비전 스크립트로 슬라이드 전환을 감지한 뒤, 수작업으로 타임코드를 맞춰야 했습니다.

Google Gemini의 네이티브 멀티모달 비디오 이해 역량은 이러한 작업 방식을 완전히 혁신합니다. 100만 개 이상의 토큰을 수용하는 초대형 컨텍스트 윈도우와 음성-영상 동기화 아키텍처를 갖춘 Gemini 모델(Gemini 3.8 Flash, Gemini 3.7 Flash, Gemini 2.5 Pro 등)은 원본 영상 파일을 직접 수용합니다. 연구원은 자연어 프롬프트만으로 참가자의 발언과 화면 조작 내용을 교차 검증하고, 특정 순간을 신속히 탐색하여 정확한 MM:SS 타임스탬프가 부여된 구조화된 요약 데이터를 도출할 수 있습니다.

본 가이드에서는 Gemini Files API를 통한 대용량 영상 업로드, 정적 모드와 에이전틱(Agentic) 모드의 전략적 선택, JSON 스키마 기반의 구조화된 출력 제어, 그리고 컨텍스트 캐싱(Context Caching)을 통한 반복 질의 비용 및 지연 시간 절감 방안을 체계적으로 다룹니다.


1. 처리 모드 선택: 정적 처리 vs 에이전틱 비디오 이해

Gemini는 두 가지 비디오 실행 모드를 제공합니다. 토큰 비용, 처리 속도, 분석 정확도 간의 균형을 맞추기 위해 올바른 모드를 선택하는 것이 필수적입니다.

평가 기준정적 처리(Static Processing, 기본값)에이전틱 비디오 이해(Agentic Video Understanding)
작동 메커니즘고정 간격(기본 1 FPS)으로 프레임을 추출하고 오디오(1Kbps)와 함께 단일 패스로 컨텍스트에 일괄 적재Think-Act-Observe 루프 기반; 모델이 타임라인을 능동 탐색하며 전사문, 특정 오디오, 주요 프레임을 온디맨드로 호출
토큰 소모량저해상도 기준 초당 약 100 토큰; 고해상도 기준 초당 약 300 토큰장시간 영상 기준 입력 토큰 최대 88% 절감; 추론은 생각 토큰, 로드된 데이터는 도구 토큰으로 정산
첫 토큰 생성 시간(TTFT)5분 미만의 짧은 클립에서 매우 빠름서버 측 사전 계획 및 다단계 도구 호출로 인해 초기 응답 지연이 소폭 증가
적합한 시나리오프레임 단위의 연속적 시각 감사, 빠른 모션 추적, 1초도 놓치지 말아야 하는 정밀 분석15분~180분의 장시간 녹화본, 특정 주제 탐색, 챕터 분할 및 주요 이벤트 요약
지원 모델모든 Gemini 모델Gemini 3.8 Flash, Gemini 3.7 Flash, 3.6 Flash, 3.5 Flash Lite

에이전틱 모드를 선택해야 하는 경우

15분을 초과하는 긴 녹화본에는 에이전틱 모드("processing": "agentic") 사용을 적극 권장합니다. 수만 장의 정적 프레임을 컨텍스트에 무조건 밀어 넣으면 비용이 급증할 뿐 아니라 불필요한 정보로 인해 모델의 주의 집중도가 분산됩니다. 에이전틱 모드에서는 모델이 먼저 음성 전사본을 훑어 주요 구간을 특정한 뒤, 화면 클릭이나 화이트보드 도표 같은 시각적 증거 확인이 필요한 순간에만 고해상도 프레임을 선택적으로 가져옵니다. 이를 통해 입력 토큰 비용을 최대 66% 절감하면서 응답 정확도를 약 7% 향상할 수 있습니다.

정적 모드가 반드시 필요한 경우

발언이 수반되지 않는 연속적인 시각적 관찰(예: 참가자의 시선 이동, 미세 표정 변화, 침묵 상태에서의 UI 헤맴 현상)을 정밀 추적해야 한다면 정적 모드가 적합합니다. 정적 모드에서는 샘플링 주기를 조정(예: fps: 0.5로 설정하여 2초당 1프레임 추출)하여 100만 토큰 한도 내에서 최장 3시간 분량의 세션을 누락 없이 분석할 수 있습니다.


2. Files API를 활용한 대용량 영상 수집

요청 본문에 비디오 데이터를 직접 인라인(base64)으로 전송하는 방식은 20MB(또는 엔드포인트에 따라 100MB) 미만의 작은 파일로 제한됩니다. 긴 리서치 영상을 다룰 때는 유료 기준 파일당 최대 20GB(무료 기준 2GB)를 지원하고 MP4, MOV, MPEG, WEBM, AVI 포맷을 폭넓게 수용하는 Files API를 사용해야 합니다.

수집 프로세스는 다음과 같은 비동기 2단계로 진행됩니다:

  1. 이어올리기(Resumable Upload): 대용량 미디어 파일을 Gemini 스토리지로 전송합니다.
  2. 상태 폴링: 서버 측 트랜스코딩과 타임라인 인덱싱이 완료되어 파일 상태가 PROCESSING에서 ACTIVE로 전환될 때까지 대기합니다.

업로드된 파일은 48시간 동안 추가 저장 비용 없이 유지되므로, 동일한 연구 데이터에 대해 하루 동안 다양한 관점의 질의를 반복 수행하기에 최적입니다.


3. 프롬프트 엔지니어링 및 JSON 스키마 구조화

모델의 분석 결과를 데이터베이스나 대시보드에 즉각 연동하려면 엄격한 시간 형식 지정과 스키마 설정이 필수적입니다:

  1. 명시적 타임스탬프 형식 지정: Gemini는 MM:SS(수 시간 분량 영상의 경우 HH:MM:SS) 형식을 기본 지원합니다. 감지된 모든 이벤트에 대해 시작 및 종료 타임스탬프를 명시하도록 프롬프트에 지시합니다.
  2. 멀티모달 교차 검증 유도: 음성과 화면의 일치 여부를 대조하도록 지시합니다. 예: “14분 20초 부근에서 참가자가 혼란을 표현했을 때 화면에 오류 팝업이 노출되었는지 확인하라.”
  3. JSON 스키마 강제: response_mime_type: "application/json"과 Pydantic 모델을 결합하여 timestamp_start, timestamp_end, event_type, summary, visual_evidence, verbal_quote 필드를 누락 없이 출력하게 함으로써 불필요한 서두 인삿말을 원천 차단합니다.
  4. 프롬프트 배치 순서: API 입력 배열을 구성할 때 텍스트 프롬프트는 항상 비디오 객체 뒤에 배치해야 합니다.

4. Python 엔드투엔드 구현 코드

다음은 리서처가 60분짜리 사용자 인터뷰 영상을 업로드하고, 에이전틱 모드와 백그라운드 비동기 실행(background=True)을 활성화하여 구조화된 타임스탬프 이벤트를 추출하는 전체 코드입니다:

import time
from google import genai
from google.genai import types
from pydantic import BaseModel, Field

# 1. 클라이언트 초기화
client = genai.Client()

# 2. Files API로 대용량 영상 업로드
print("영상 녹화본 업로드 중...")
video_file = client.files.upload(
    file="user_research_session_04.mp4",
    config={"mime_type": "video/mp4"}
)

# 3. 서버 측 비디오 전처리 완료 대기
while video_file.state.name == "PROCESSING":
    print("서버에서 트랜스코딩 및 인덱싱 진행 중... 5초 후 재확인")
    time.sleep(5)
    video_file = client.files.get(name=video_file.name)

if video_file.state.name == "FAILED":
    raise RuntimeError("서버에서 비디오 처리에 실패했습니다. 파일 포맷을 확인하세요.")

print(f"영상 준비 완료, 리소스 URI: {video_file.uri}")

# 4. 구조화된 출력 데이터 모델 정의
class VideoEvent(BaseModel):
    timestamp_start: str = Field(description="이벤트 시작 시간 (MM:SS 형식)")
    timestamp_end: str = Field(description="이벤트 종료 시간 (MM:SS 형식)")
    event_type: str = Field(description="유형: 페인포인트, 기능 요청, 조작 실수, 논의")
    summary: str = Field(description="발생 상황에 대한 간결한 요약")
    visual_evidence: str = Field(description="화면에서 관찰된 시각적 증거 및 조작 로그")
    verbal_quote: str = Field(description="참가자의 핵심 발언 원문")

class ResearchSummary(BaseModel):
    video_overview: str = Field(description="세션 전반에 대한 요약")
    events: list[VideoEvent] = Field(description="시간순으로 정렬된 구조화된 이벤트 목록")

# 5. 에이전틱 모드 분석 요청 (백그라운드 비동기 실행 적용)
# background=True는 장시간 심층 추론 중 네트워크 연결 끊김 현상을 방지함
prompt_text = """
이 사용자 연구 인터뷰 녹화본을 분석하세요.
참가자가 겪은 모든 UI 조작 상의 불편함, 기능 제안, 주요 결정 순간을 식별하세요.
음성 발언과 화면 조작 내용을 대조하여 정확한 MM:SS 타임스탬프와 함께 시간순으로 출력하세요.
"""

print("에이전틱 비디오 분석 요청 전송 중...")
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "video",
            "uri": video_file.uri,
            "mime_type": video_file.mime_type,
            "processing": "agentic"  # 에이전틱 타임라인 탐색 활성화
        },
        {
            "type": "text",
            "text": prompt_text
        }
    ],
    response_mime_type="application/json",
    response_schema=ResearchSummary,
    background=True  # 서버 측 비동기 백그라운드 실행
)

# 6. 백그라운드 작업 완료 여부 폴링
while interaction.status == "in_progress":
    print("모델이 타임라인을 탐색하며 증거를 종합하는 중...")
    time.sleep(5)
    interaction = client.interactions.get(interaction.id)

print("\n--- 추출 결과 ---")
print(interaction.output_text)

5. 컨텍스트 캐싱(Context Caching)을 통한 반복 정성 분석 최적화

정성 조사 연구에서 동일한 영상을 단 한 번만 조회하는 경우는 드뭅니다. 대개 전체 아젠다를 먼저 파악한 후, 경쟁사 언급 여부, 참가자의 감정 곡선, 특정 기능 플로우 등에 대해 꼬리 질문을 던지게 됩니다.

매번 90분짜리 영상을 새로 전송하고 처리한다면 비용과 대기 시간이 기하급수적으로 증가합니다. Gemini의 컨텍스트 캐싱은 이 문제를 효과적으로 해결합니다:


6. 실무 주의사항 및 문제 해결 가이드


참고 자료