巨大ビデオファイル理解API完全ガイド:100MBから2GBの動画を処理する3つの方法

AIによる超大容量ビデオファイルの解析は、開発者にとって常に大きな悩みでした。ファイルが大きすぎてアップロードがタイムアウトしたり、Base64エンコードによるメモリ不足が発生したり、APIが413エラーを返したりといった問題です。

嬉しいニュースがあります。2026年1月、GoogleはGemini APIのファイル処理能力を大幅に強化しました。インラインアップロードの制限が20MBから100MBに引き上げられ、Files APIは最大2GBをサポート。さらに、YouTube URLを直接分析できる機能も追加されました。 本記事では、これら3つの超大容量ビデオ処理スキームを詳しく解説し、最適な技術ルートの選択をサポートします。

核心的価値: 本記事を読み終える頃には、100MBから2GBの超大容量ビデオを処理するための完全なソリューションを習得し、ビデオのサイズ、使用頻度、ビジネスシーンに応じて最適なアップロード方法を選択できるようになります。

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


Gemini 超大容量ビデオファイルアップロード方法の概要

技術的な詳細に入る前に、Geminiが提供する3つのビデオアップロード方式を確認しましょう。

アップロード方法 ファイルサイズ制限 活用シーン メリット デメリット
Base64 インライン ≤ 100MB 短尺ビデオ、迅速なテスト 単一リクエスト、シンプルなコード 大容量ファイルではメモリ負荷大
Files API ≤ 2GB 大容量ビデオ、繰り返し利用 超大容量ファイルをサポート、再利用可能 2ステップの操作が必要
YouTube URL 無制限* 超長尺ビデオ、公開コンテンツ アップロード不要、超長尺ビデオを処理 公開/限定公開ビデオのみ対応

🎯 重要アドバイス: 100MBを超えるビデオファイルについては、YouTubeにアップロードしてURL経由で分析するか、Files APIを使用してアップロードすることを優先的に検討してください。これら2つの方法は、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-ja 图示


Gemini ビデオ理解ソリューション 1:YouTube URL による直接分析

非常に大きなビデオファイルの場合、最もエレガントな解決策は YouTube にアップロードし、URL を通じて Gemini に直接分析させることです。これは Google のネイティブ統合機能であり、ファイルを転送する必要がありません。

YouTube URL 方式の主なメリット

メリット 説明
ファイルサイズの制限なし YouTube は最大 256GB までのビデオアップロードをサポートしています
再アップロード不要 ビデオが既に YouTube にある場合、直接参照するだけで済みます
ネイティブ統合 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 方式の使用制限

制限項目 無料版 有料版
1日あたりのアップロード時間 8 時間 無制限
1回のリクエストあたりのビデオ数 1 個 10 個 (Gemini 1.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-ja 图示


Gemini 動画理解プラン3: Base64 インラインアップロード

100MB以下の小さな動画の場合、Base64 インラインアップロードが最も簡単な方法です。1回の 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 動画トークン計算式

解像度 動画フレーム オーディオ 1秒あたりの合計
標準/高 258 tokens/フレーム 32 tokens/秒 ~300 tokens/秒
低 (360p) 66 tokens/フレーム 32 tokens/秒 ~100 tokens/秒

動画の長さ別トークン消費量

動画の長さ 標準解像度 低解像度 節約率
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 tokens/秒
    }
)

💰 コスト最適化: 内容理解タスク(動画の要約、カテゴリ分類など)では、通常は低解像度で十分です。詳細の認識(文字や小さな物体など)が必要な場合にのみ、高解像度が必要になります。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 の動画をサポートしており、「限定公開(Unlisted)」に設定することでプライバシーを保護できます。
  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)」動画の分析をサポートしていませんが、以下の 2 つの設定には対応しています。

公開設定 サポート状況 説明
公開 (Public) ✅ サポート 誰でも閲覧可能
限定公開 (Unlisted) ✅ サポート リンクを知っている人のみ閲覧可能
非公開 (Private) ❌ 非サポート 投稿者本人のみ閲覧可能

アドバイス: 動画にプライバシーが含まれる場合は、「限定公開」に設定するのが最適です。プライバシーを保護しつつ、API での分析が可能です。

Q3: 動画の特定のセグメントだけを分析するには?

Gemini は動画セグメントの指定に 2 つの方法を提供しています。

方法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-ja 图示

本記事では、超巨大動画ファイルを処理するための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 にアクセスしてテクニカルサポートをご確認ください。

コメントする