초대형 동영상 파일 이해 API 완전 가이드: 100MB에서 2GB 동영상을 처리하는 3가지 방법

초대형 동영상 파일의 AI 이해는 항상 개발자들의 골칫거리였습니다. 파일이 너무 커서 업로드 시간이 초과되거나, base64 인코딩 시 메모리 부족이 발생하고, 인터페이스에서 413 오류를 반환하곤 했죠. 다행히 2026년 1월, 구글은 Gemini API의 파일 처리 능력을 대폭 업그레이드했습니다. 인라인 업로드 제한이 20MB에서 100MB로 상향되었고, Files API는 최대 2GB까지 지원하며, 유튜브 URL 직접 분석 기능도 추가되었습니다. 이 글에서는 초대형 동영상을 처리하는 3가지 방안을 자세히 살펴보고, 여러분의 프로젝트에 가장 적합한 기술 경로를 선택할 수 있도록 도와드릴게요.

핵심 가치: 이 글을 읽고 나면 100MB에서 2GB에 이르는 초대형 동영상을 처리하는 완전한 해결책을 마스터하게 됩니다. 동영상 크기, 사용 빈도 및 비즈니스 시나리오에 따라 최적의 업로드 방식을 선택하실 수 있습니다.

gemini-large-video-understanding-api-guide-ko 图示


Gemini 초대형 동영상 파일 업로드 방안 한눈에 보기

기술적인 세부 사항에 들어가기 전, Gemini가 제공하는 세 가지 동영상 업로드 방식을 먼저 알아보겠습니다.

업로드 방식 파일 크기 제한 적용 시나리오 장점 한계
Base64 인라인 ≤ 100MB 소형 동영상, 빠른 테스트 단일 요청, 단순한 코드 대형 파일 시 메모리 압박
Files API ≤ 2GB 대형 동영상, 반복 사용 초대형 파일 지원, 재사용 가능 2단계 작업 필요
YouTube URL 제한 없음* 초장거리 동영상, 공개 콘텐츠 업로드 불필요, 초장거리 동영상 처리 공개/일부 공개 동영상만 지원

🎯 핵심 권장 사항: 100MB를 초과하는 동영상 파일의 경우, YouTube에 업로드하여 URL로 분석하거나 Files API를 사용하여 업로드하는 것을 우선적으로 고려하세요. 이 두 가지 방식은 GB 단위의 동영상 파일도 안정적으로 처리할 수 있습니다.

Gemini 동영상 이해 지원 모델

모델 최대 동영상 길이 컨텍스트 윈도우 특징
gemini-3-pro-preview 6시간 (저해상도) 2M tokens 가장 강력한 동영상 이해 능력
gemini-2.5-flash 3시간 (저해상도) 1M tokens 가성비 최고의 선택
gemini-2.5-pro 6시간 (저해상도) 2M tokens 복잡한 작업 시 최선책

gemini-large-video-understanding-api-guide-ko 图示


Gemini 비디오 이해 솔루션 1: YouTube URL 직접 분석

초대용량 비디오 파일의 경우, 가장 깔끔한 해결책은 YouTube에 업로드한 뒤 URL을 통해 Gemini가 직접 분석하도록 하는 것입니다. 이는 Google의 네이티브 통합 기능으로, 별도의 파일 전송이 필요 없습니다.

YouTube URL 방식의 핵심 장점

장점 설명
파일 크기 제한 없음 YouTube는 최대 256GB의 비디오 업로드를 지원합니다.
중복 업로드 불필요 비디오가 이미 YouTube에 있다면 URL만 참조하면 됩니다.
네이티브 통합 Google 자사 제품 간의 연동으로 지연 시간이 가장 낮습니다.
초장거리 비디오 지원 유료 버전에서는 재생 시간 제한이 없습니다.

YouTube URL 비디오 이해 코드 예시

import openai

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # APIYI 통합 인터페이스 사용
)

# YouTube URL을 통한 비디오 분석
response = client.chat.completions.create(
    model="gemini-3-pro-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "이 비디오의 주요 내용을 분석하고, 핵심 시간대와 해당 이벤트를 나열해 주세요."
                },
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://www.youtube.com/watch?v=VIDEO_ID"
                    }
                }
            ]
        }
    ],
    max_tokens=4096
)

print(response.choices[0].message.content)

YouTube URL 방식 사용 제한

제한 항목 무료 버전 유료 버전
일일 업로드 시간 8시간 무제한
단일 요청 비디오 수 1개 10개 (Gemini 2.5 이상)
비디오 공개 설정 요구 공개/일부 공개 공개/일부 공개
비공개 비디오 ❌ 지원 안 함 ❌ 지원 안 함

💡 실용적인 팁: 비디오 내용에 개인정보가 포함되어 있다면 YouTube 비디오 설정을 "일부 공개(Unlisted)"로 지정해 보세요. 링크를 아는 사람만 접근할 수 있지만, Gemini API는 정상적으로 분석할 수 있습니다. APIYI(apiyi.com)를 통해 호출할 때도 YouTube URL 기능을 동일하게 지원합니다.

타임스탬프 쿼리 예시

Gemini는 비디오의 특정 시간점에 대한 정밀한 쿼리를 지원합니다.

# 비디오의 특정 시간대 내용 쿼리
response = client.chat.completions.create(
    model="gemini-3-pro-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "비디오의 02:30과 05:45 지점에서 각각 어떤 내용이 나오는지 알려주세요."
                },
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://www.youtube.com/watch?v=VIDEO_ID"
                    }
                }
            ]
        }
    ]
)

Gemini 비디오 이해 솔루션 2: Files API를 활용한 대용량 파일 업로드

사내 교육용 영상이나 영업 비밀처럼 YouTube에 업로드하기 어려운 비공개 비디오의 경우, Files API가 100MB에서 2GB 사이의 비디오를 처리하는 데 가장 적합한 선택입니다.

Files API 업로드 프로세스

로컬 비디오 파일 → Files API 업로드 → file_uri 획득 → 분석 요청 실행

Files API 전체 코드 예시

import google.generativeai as genai
import time

# API 설정
genai.configure(api_key="YOUR_API_KEY")

def upload_large_video(video_path: str) -> str:
    """
    Gemini Files API에 대용량 비디오 파일 업로드
    최대 2GB 파일 지원
    """
    print(f"비디오 업로드 중: {video_path}")

    # 파일 업로드
    video_file = genai.upload_file(
        path=video_path,
        display_name="large_video"
    )

    # 파일 처리 완료 대기
    while video_file.state.name == "PROCESSING":
        print("처리 중...")
        time.sleep(5)
        video_file = genai.get_file(video_file.name)

    if video_file.state.name == "FAILED":
        raise ValueError(f"파일 처리 실패: {video_file.state.name}")

    print(f"업로드 성공! URI: {video_file.uri}")
    return video_file.uri

def analyze_video(file_uri: str, prompt: str) -> str:
    """
    업로드된 비디오 분석
    """
    model = genai.GenerativeModel("gemini-3-pro-preview")

    response = model.generate_content([
        file_uri,
        prompt
    ])

    return response.text

# 사용 예시
video_uri = upload_large_video("/path/to/large_video.mp4")
result = analyze_video(
    video_uri,
    "이 비디오의 내용을 주요 장면, 인물의 활동, 핵심 정보 등을 포함하여 상세히 분석해 주세요."
)
print(result)

Files API 파일 관리

# 업로드된 모든 파일 목록 확인
for file in genai.list_files():
    print(f"파일명: {file.name}")
    print(f"  URI: {file.uri}")
    print(f"  크기: {file.size_bytes / 1024 / 1024:.2f} MB")
    print(f"  상태: {file.state.name}")
    print()

# 더 이상 필요 없는 파일 삭제 (저장 공간 절약)
genai.delete_file(file.name)

🎯 비용 최적화: Files API로 업로드한 파일은 여러 번의 요청에서 재사용할 수 있어 중복 업로드를 피할 수 있습니다. 여러 번 분석해야 하는 비디오라면 먼저 한 번 업로드한 뒤, file_uri를 저장해 두고 나중에 활용하는 것을 권장합니다. APIYI(apiyi.com) 플랫폼을 통해 호출할 때도 Files API의 모든 기능을 지원합니다.

gemini-large-video-understanding-api-guide-ko 图示


Gemini 비디오 이해 방안 3: Base64 인라인 업로드

100MB 이하의 작은 비디오라면 Base64 인라인 업로드가 가장 간단한 방법이에요. 단 한 번의 API 호출만으로 모든 과정을 마칠 수 있거든요.

Base64 인라인 업로드 코드 예시

import openai
import base64
from pathlib import Path

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # APIYI 통합 인터페이스
)

def analyze_video_inline(video_path: str, prompt: str) -> str:
    """
    비디오 분석을 위한 인라인 업로드 (100MB 이하 비디오에 적합)
    """
    # 비디오 읽기 및 인코딩
    video_bytes = Path(video_path).read_bytes()
    video_size_mb = len(video_bytes) / 1024 / 1024

    if video_size_mb > 100:
        raise ValueError(f"비디오 크기 {video_size_mb:.2f}MB가 100MB 제한을 초과했습니다. Files API를 사용해 주세요.")

    video_base64 = base64.b64encode(video_bytes).decode('utf-8')

    # MIME 유형 확인
    suffix = Path(video_path).suffix.lower()
    mime_types = {
        '.mp4': 'video/mp4',
        '.avi': 'video/avi',
        '.mov': 'video/quicktime',
        '.webm': 'video/webm',
        '.mkv': 'video/x-matroska'
    }
    mime_type = mime_types.get(suffix, 'video/mp4')

    response = client.chat.completions.create(
        model="gemini-3-pro-preview",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                    {
                        "type": "image_url",  # 비디오도 image_url 유형을 사용합니다.
                        "image_url": {
                            "url": f"data:{mime_type};base64,{video_base64}"
                        }
                    }
                ]
            }
        ],
        max_tokens=4096
    )

    return response.choices[0].message.content

# 사용 예시
result = analyze_video_inline(
    "short_clip.mp4",
    "이 비디오 클립의 주요 내용을 설명해 주세요."
)
print(result)

Base64 인라인 업로드 시 주의사항

주의사항 설명
메모리 점유 Base64 인코딩을 거치면 데이터 양이 약 33% 증가해요.
타임아웃 위험 파일이 크면 업로드 시간이 길어져 타임아웃이 발생할 수 있습니다.
재사용 불가 요청을 보낼 때마다 매번 다시 업로드해야 합니다.
권장 길이 1분 이내의 짧은 비디오에 적합합니다.

Gemini 비디오 이해 토큰 계산 및 비용 최적화

비용을 효과적으로 관리하려면 토큰 계산 규칙을 잘 알아두는 것이 중요해요.

Gemini 비디오 토큰 계산 공식

해상도 비디오 프레임 오디오 초당 합계
표준/높음 258 토큰/프레임 32 토큰/초 약 300 토큰/초
낮음 (360p) 66 토큰/프레임 32 토큰/초 약 100 토큰/초

비디오 길이에 따른 토큰 소모량

비디오 길이 표준 해상도 낮은 해상도 절약 비율
1분 18,000 6,000 67%
10분 180,000 60,000 67%
1시간 1,080,000 360,000 67%
6시간 6,480,000 2,160,000 67%

낮은 해상도 설정을 통한 비용 절감

# 낮은 해상도를 사용하여 긴 비디오를 처리하고 토큰을 67% 절약합니다.
response = client.chat.completions.create(
    model="gemini-3-pro-preview",
    messages=[...],
    extra_body={
        "media_resolution": "low"  # 360p, 100 토큰/초
    }
)

💰 비용 최적화: 비디오 요약이나 내용 분류 같은 일반적인 이해 작업에는 낮은 해상도(low)를 사용하는 것만으로도 충분해요. 텍스트 추출이나 아주 작은 물체 식별처럼 아주 세밀한 디테일이 필요할 때만 높은 해상도를 사용하세요. APIYI(apiyi.com)를 통해 Gemini 비디오 이해 기능을 활용하면 더욱 합리적인 가격으로 이용할 수 있습니다.


Gemini 대용량 비디오 처리 실전: 전체 워크플로우

비디오 크기에 따라 가장 적합한 업로드 방식을 자동으로 선택해 주는 전체 솔루션을 소개합니다.

전체 코드 펼치기
"""
Gemini 대용량 비디오 파일 이해를 위한 통합 솔루션
비디오 크기에 따라 최적의 업로드 방식을 자동으로 선택합니다.
"""

import openai
import google.generativeai as genai
import base64
import time
from pathlib import Path
from typing import Optional, Union
from dataclasses import dataclass
from enum import Enum

class UploadMethod(Enum):
    INLINE = "inline"
    FILES_API = "files_api"
    YOUTUBE = "youtube"

@dataclass
class VideoAnalysisResult:
    success: bool
    method: UploadMethod
    content: Optional[str] = None
    error: Optional[str] = None
    tokens_used: Optional[int] = None

class GeminiVideoAnalyzer:
    """
    지능형 비디오 분석기
    다양한 크기의 비디오를 처리하기 위해 최적의 업로드 방식을 자동으로 선택합니다.
    """

    # 파일 크기 임계값 (바이트)
    INLINE_MAX_SIZE = 100 * 1024 * 1024  # 100MB
    FILES_API_MAX_SIZE = 2 * 1024 * 1024 * 1024  # 2GB

    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.apiyi.com/v1"
    ):
        self.client = openai.OpenAI(
            api_key=api_key,
            base_url=base_url
        )
        genai.configure(api_key=api_key)

    def _get_file_size(self, video_path: str) -> int:
        """파일 크기 확인"""
        return Path(video_path).stat().st_size

    def _choose_method(
        self,
        video_path: Optional[str] = None,
        youtube_url: Optional[str] = None
    ) -> UploadMethod:
        """입력값에 따라 업로드 방식 자동 선택"""

        if youtube_url:
            return UploadMethod.YOUTUBE

        if video_path:
            file_size = self._get_file_size(video_path)
            if file_size <= self.INLINE_MAX_SIZE:
                return UploadMethod.INLINE
            elif file_size <= self.FILES_API_MAX_SIZE:
                return UploadMethod.FILES_API
            else:
                raise ValueError(
                    f"파일 크기 {file_size / 1024 / 1024 / 1024:.2f}GB가 "
                    f"2GB 제한을 초과했습니다. YouTube에 업로드한 후 URL을 사용하여 분석해 주세요."
                )

        raise ValueError("video_path 또는 youtube_url을 제공해야 합니다.")

    def _analyze_inline(
        self,
        video_path: str,
        prompt: str,
        media_resolution: str = "standard"
    ) -> str:
        """인라인 업로드 분석"""
        video_bytes = Path(video_path).read_bytes()
        video_base64 = base64.b64encode(video_bytes).decode('utf-8')

        suffix = Path(video_path).suffix.lower()
        mime_types = {
            '.mp4': 'video/mp4',
            '.avi': 'video/avi',
            '.mov': 'video/quicktime',
            '.webm': 'video/webm'
        }
        mime_type = mime_types.get(suffix, 'video/mp4')

        response = self.client.chat.completions.create(
            model="gemini-3-pro-preview",
            messages=[{
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:{mime_type};base64,{video_base64}"
                        }
                    }
                ]
            }],
            extra_body={"media_resolution": media_resolution}
        )

        return response.choices[0].message.content

    def _analyze_files_api(
        self,
        video_path: str,
        prompt: str,
        media_resolution: str = "standard"
    ) -> str:
        """Files API 업로드 분석"""
        # 파일 업로드
        video_file = genai.upload_file(path=video_path)

        # 처리 완료 대기
        while video_file.state.name == "PROCESSING":
            time.sleep(5)
            video_file = genai.get_file(video_file.name)

        if video_file.state.name == "FAILED":
            raise ValueError("파일 처리 실패")

        # 비디오 분석
        model = genai.GenerativeModel("gemini-3-pro-preview")
        response = model.generate_content(
            [video_file, prompt],
            generation_config={
                "media_resolution": media_resolution
            }
        )

        return response.text

    def _analyze_youtube(
        self,
        youtube_url: str,
        prompt: str,
        media_resolution: str = "standard"
    ) -> str:
        """YouTube URL 분석"""
        response = self.client.chat.completions.create(
            model="gemini-3-pro-preview",
            messages=[{
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                    {
                        "type": "video_url",
                        "video_url": {"url": youtube_url}
                    }
                ]
            }],
            extra_body={"media_resolution": media_resolution}
        )

        return response.choices[0].message.content

    def analyze(
        self,
        prompt: str,
        video_path: Optional[str] = None,
        youtube_url: Optional[str] = None,
        media_resolution: str = "standard",
        force_method: Optional[UploadMethod] = None
    ) -> VideoAnalysisResult:
        """
        비디오 내용 분석

        Args:
            prompt: 분석 프롬프트
            video_path: 로컬 비디오 경로 (선택 사항)
            youtube_url: YouTube 비디오 URL (선택 사항)
            media_resolution: 해상도 ("low"/"standard"/"high")
            force_method: 강제로 사용할 업로드 방식 (선택 사항)

        Returns:
            VideoAnalysisResult 객체
        """

        try:
            # 업로드 방식 선택
            method = force_method or self._choose_method(video_path, youtube_url)
            print(f"사용 중인 업로드 방식: {method.value}")

            # 분석 실행
            if method == UploadMethod.INLINE:
                content = self._analyze_inline(video_path, prompt, media_resolution)
            elif method == UploadMethod.FILES_API:
                content = self._analyze_files_api(video_path, prompt, media_resolution)
            elif method == UploadMethod.YOUTUBE:
                content = self._analyze_youtube(youtube_url, prompt, media_resolution)

            return VideoAnalysisResult(
                success=True,
                method=method,
                content=content
            )

        except Exception as e:
            return VideoAnalysisResult(
                success=False,
                method=method if 'method' in dir() else UploadMethod.INLINE,
                error=str(e)
            )


# 사용 예시
if __name__ == "__main__":
    analyzer = GeminiVideoAnalyzer(api_key="your-api-key")

    # 예시 1: 작은 비디오 (자동으로 인라인 업로드 사용)
    result = analyzer.analyze(
        prompt="비디오 내용을 설명해 주세요",
        video_path="small_clip.mp4"
    )

    # 예시 2: 큰 비디오 (자동으로 Files API 사용)
    result = analyzer.analyze(
        prompt="이 교육 비디오의 주요 지식 포인트를 분석해 주세요",
        video_path="training_video_500mb.mp4",
        media_resolution="low"  # 긴 비디오는 비용 절감을 위해 저해상도 사용
    )

    # 예시 3: YouTube 비디오
    result = analyzer.analyze(
        prompt="이 비디오의 핵심 관점을 요약해 주세요",
        youtube_url="https://www.youtube.com/watch?v=VIDEO_ID"
    )

    if result.success:
        print(f"분석 방식: {result.method.value}")
        print(f"결과:\n{result.content}")
    else:
        print(f"분석 실패: {result.error}")

Gemini 비디오 이해 관련 자주 묻는 질문(FAQ)

Q1: 2GB가 넘는 비디오는 어떻게 처리하나요?

2GB를 초과하는 비디오는 다음과 같은 해결 방법이 있습니다.

  1. YouTube에 업로드: 가장 권장되는 방식입니다. YouTube는 최대 256GB의 비디오를 지원하며, '일부 공개'로 설정하면 개인정보를 보호할 수 있습니다.
  2. 비디오 압축: FFmpeg를 사용하여 해상도나 비트레이트를 낮춥니다.
  3. 비디오 분할: 긴 비디오를 여러 개의 짧은 클립으로 나누어 각각 분석합니다.
# FFmpeg를 사용하여 비디오를 1GB 이내로 압축
ffmpeg -i input.mp4 -vcodec h264 -acodec aac -fs 1G output.mp4

# 비디오를 10분 단위로 분할
ffmpeg -i input.mp4 -c copy -segment_time 600 -f segment output_%03d.mp4

APIYI(apiyi.com) 플랫폼을 통해 호출할 때, 모든 표준 비디오 처리 방식을 지원합니다.

Q2: YouTube 비공개 비디오도 분석할 수 있나요?

현재 Gemini API는 비공개(Private) 비디오 분석은 지원하지 않지만, 다음 두 가지는 지원합니다.

공개 범위 지원 여부 설명
공개 (Public) ✅ 지원 모든 사람이 볼 수 있음
일부 공개 (Unlisted) ✅ 지원 링크를 아는 사람만 볼 수 있음
비공개 (Private) ❌ 지원 안 함 제작자 본인만 볼 수 있음

: 비디오에 민감한 내용이 포함되어 있다면 '일부 공개'로 설정하는 것이 가장 좋습니다. 개인정보를 보호하면서 API 분석도 가능하기 때문입니다.

Q3: 비디오의 특정 구간만 분석하려면 어떻게 하나요?

Gemini는 비디오 구간을 지정하는 두 가지 방식을 지원합니다.

방법 1: 타임스탬프 쿼리

prompt = "비디오 05:30부터 08:45 사이의 내용을 분석해 주세요"

방법 2: 비디오 클리핑 파라미터 (2026년 신기능)

response = client.chat.completions.create(
    model="gemini-3-pro-preview",
    messages=[...],
    extra_body={
        "video_clip": {
            "start_time": "00:05:30",
            "end_time": "00:08:45"
        }
    }
)
Q4: 긴 비디오를 분석할 때 비용을 어떻게 절약하나요?

긴 비디오 비용 최적화를 위한 3가지 팁:

  1. 저해상도 사용: media_resolution: "low"로 설정하면 토큰을 67% 절약할 수 있습니다.
  2. 분석 구간 지정: 전체를 처리하는 대신 필요한 부분만 분석합니다.
  3. 이미 업로드된 파일 재사용: Files API로 업로드한 후 URI를 저장해 두면 중복 업로드를 피할 수 있습니다.

APIYI(apiyi.com)를 통해 Gemini 비디오 이해 기능을 호출하면 공식 가격보다 더 저렴하게 이용할 수 있어 대량의 비디오 분석 시나리오에 적합합니다.


gemini-large-video-understanding-api-guide-ko 图示

이 글에서는 대용량 비디오 파일을 처리하기 위한 3가지 종합 솔루션을 소개합니다:

솔루션 파일 크기 최적의 사례 복잡도
Base64 인라인 ≤ 100MB 빠른 테스트, 짧은 영상
Files API ≤ 2GB 프라이빗 대용량 비디오, 반복 분석 ⭐⭐
YouTube URL 제한 없음 초장거리 비디오, 공개 콘텐츠

솔루션 선택 결정 흐름

비디오가 이미 YouTube에 있나요?
├── 예 → YouTube URL 사용 (가장 간단)
└── 아니요 → 비디오 크기는?
    ├── ≤ 100MB → Base64 인라인 (단일 요청)
    ├── 100MB-2GB → Files API (재사용 지원)
    └── > 2GB → YouTube 업로드 또는 압축/분할

🎯 최종 제안: 대용량 비디오 파일의 경우 YouTube URL 솔루션을 우선적으로 고려해 보세요. 파일 크기 제한이 없을 뿐만 아니라 Google의 네이티브 통합을 통해 지연 시간을 최소화할 수 있습니다. APIYI(apiyi.com)를 통해 Gemini 비디오 이해 기능을 호출하면 더욱 합리적인 가격과 안정적인 서비스를 이용할 수 있습니다.


이 글은 APIYI 기술 팀에서 작성했습니다. 멀티모달 AI API 활용 팁에 대해 더 알고 싶으시다면 apiyi.com을 방문하여 기술 지원을 받아보세요.

댓글 남기기