◉GEMINI LABEN
●CLI — Gemini CLI の nightly(10月2日)で、チャット記録を追記専用にして履歴の窓幅を絞る修正が入りました。長い会話の重さに効く変更です●12/31 — 導入価格の終了まで残り89日。3.8 / 3.7 / 3.6 Flash は入力 $0.75→$1.50、出力 $3.75→$7.50 になります●ACP — MCP ツールの許可要求が、どのサーバーからのものか表示されないという報告(#29595)が出ています。許可の読み方が論点です●NEW — 3月に増えた Docs・Sheets・Slides・Drive の Gemini 機能、半年後に残したものと外したもの●WINDOWS — Windows で GIT_CONFIG_GLOBAL=NUL が固定され、Git が失敗するという報告(#29614)があります。Windows で CLI を使う方は要確認です●LITE — gemini-3.1-flash-lite は2027年5月7日に停止予定で、後継は gemini-3.5-flash-lite です。急ぎではありませんが、移行表を作っておく題材です●CLI — Gemini CLI の nightly(10月2日)で、チャット記録を追記専用にして履歴の窓幅を絞る修正が入りました。長い会話の重さに効く変更です●12/31 — 導入価格の終了まで残り89日。3.8 / 3.7 / 3.6 Flash は入力 $0.75→$1.50、出力 $3.75→$7.50 になります●ACP — MCP ツールの許可要求が、どのサーバーからのものか表示されないという報告(#29595)が出ています。許可の読み方が論点です●NEW — 3月に増えた Docs・Sheets・Slides・Drive の Gemini 機能、半年後に残したものと外したもの●WINDOWS — Windows で GIT_CONFIG_GLOBAL=NUL が固定され、Git が失敗するという報告(#29614)があります。Windows で CLI を使う方は要確認です●LITE — gemini-3.1-flash-lite は2027年5月7日に停止予定で、後継は gemini-3.5-flash-lite です。急ぎではありませんが、移行表を作っておく題材です
記事一覧/API / SDK
◈ API / SDK/2026-07-05上級

Omni Flash で動画理解を1パスに畳む — フレーム抽出前提の構成をどこで手放すか

Omni Flash の公開プレビューで、ffmpeg のフレーム抽出と個別呼び出しに頼っていた動画理解を1回のネイティブ呼び出しへ畳む最小構成と、フレーム抽出を残すべき境界を実測ベースで整理します。

Gemini Omni Flash3動画理解3マルチモーダル25Files API5コスト設計14

✦ プレミアム記事

個人開発で短尺の紹介動画をいくつか扱うようになってから、動画を「理解させる」処理がいちばん重い工程になっていました。ffmpeg で毎秒フレームを切り出し、1枚ずつモデルに投げて説明を集め、最後にもう一度まとめる。動くには動くのですが、1本の動画を1回さばくのに7〜9回の API 呼び出しが走り、音声はまるごと捨てていました。

Omni Flash が公開プレビューに入り、動画をそのまま渡して理解させる経路が現実的になりました。以下では、私が実際にフレーム抽出前提の構成から1パスへ寄せたときの最小コード、相対的な計測、そして「ここから先はフレーム抽出を残したほうがよい」という境界を、判断できる形でまとめます。

フレーム抽出前提の3段パイプラインが抱えていた負債

これまで使っていた構成は、抽出・記述・要約の3段でした。コードにすると負債の場所がはっきりします。

import subprocess, os
from google import genai
 
client = genai.Client()
 
def extract_frames(video_path: str, fps: float = 1.0, out_dir: str = "frames") -> list[str]:
    os.makedirs(out_dir, exist_ok=True)
    subprocess.run([
        "ffmpeg", "-i", video_path,
        "-vf", f"fps={fps}", f"{out_dir}/f_%04d.jpg",
    ], check=True)
    return sorted(os.path.join(out_dir, f) for f in os.listdir(out_dir))
 
def describe_video(video_path: str) -> str:
    frames = extract_frames(video_path, fps=1.0)
    notes = []
    for i, path in enumerate(frames):           # フレーム枚数ぶん呼び出しが増える
        img = client.files.upload(file=path)
        r = client.models.generate_content(
            model="gemini-3.5-flash",
            contents=[img, f"{i}秒付近のフレームです。写っているものを一文で。"],
        )
        notes.append(f"[{i}s] {r.text.strip()}")
    summary = client.models.generate_content(    # さらに二次要約でもう1回
        model="gemini-3.5-flash",
        contents=["以下は毎秒のフレーム記述です。動画全体を3行で要約してください。\n" + "\n".join(notes)],
    )
    return summary.text

負債は3つあります。第一に、呼び出し回数が動画の長さに比例して増えます。第二に、音声トラックを一切見ていないため、ナレーションや効果音に依存する内容を取りこぼします。第三に、フレームを時系列インデックスで並べているだけなので、モデルは「動き」を推論できず、静止画の羅列として扱います。私の用途では、この3つ目が精度の頭打ちになっていました。

Omni Flash に動画をそのまま渡す最小構成

Omni Flash はネイティブに動画を扱うため、Files API でアップロードした動画を1回の generate_content に渡すだけで済みます。構造化出力と組み合わせると、後段のパースも消えます。

import time
from google import genai
from pydantic import BaseModel
 
client = genai.Client()
 
class VideoReport(BaseModel):
    summary: str
    spoken_language: str
    has_music: bool
    safe_for_all_ages: bool
    key_moments: list[str]
 
def understand_video(video_path: str) -> VideoReport:
    f = client.files.upload(file=video_path)
    # アップロード直後は PROCESSING。ACTIVE になるまで待たないと 400 になる
    while f.state.name == "PROCESSING":
        time.sleep(2)
        f = client.files.get(name=f.name)
    if f.state.name != "ACTIVE":
        raise RuntimeError(f"upload failed: {f.state.name}")
 
    r = client.models.generate_content(
        model="gemini-omni-flash-preview",   # 公開プレビュー。実IDは changelog の表記に合わせる
        contents=[f, "この動画を通しで理解し、指定スキーマで返してください。"],
        config={
            "response_mime_type": "application/json",
            "response_schema": VideoReport,
        },
    )
    return r.parsed

呼び出しは1回です。映像・音声・時間経過をひとつのコンテキストで見るため、has_music や spoken_language のように、フレーム抽出版では取れなかった軸が同時に返ります。私は最初、フレーム版の出力に寄せてテキスト要約だけを受け取っていましたが、response_schema を渡して必要な軸を明示したほうが、後続の分岐がそのまま書けて扱いやすかったです。

Before / After の差はコード量以上に「何を捨てているか」に出ます。Before は音声と動きを捨てて呼び出し回数を払い、After はその両方を1回で拾います。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦ffmpeg のフレーム抽出+個別呼び出し(1本あたり7〜9回)を Omni Flash の1回のネイティブ呼び出しに畳む最小構成
✦1パス処理が崩れる3つの境界(長尺・フレーム精密検出・低コストの真偽判定)とフレーム抽出を残す判断基準
✦粗い1パス判定→必要区間だけフレーム精査するハイブリッド構成と、アップロード状態・トークン予算で踏んだ落とし穴
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ API / SDK2026-08-23
アプリに載せる AI 機能を、実行時呼び出しから配布前の一括処理に寄せました
アプリに Gemini を組み込むとき、実行時に呼ぶか配布前に呼び終えるかで呼び出し回数の増え方が変わります。素材数に比例させる設計へ切り替えた判断基準と、冪等な一括処理の実装をまとめました。
◈ API / SDK2026-08-18
Gemini 3.7 Flash と 3.1 Pro の使い分けを、速さではなくやり直しのコストで決める
新しい Flash が出るたびにモデル選定をやり直す作業を、判断基準ごと組み替えました。出力の誤りを機械で拾えるかどうかで振り分ける方法と、導入価格が切れる12月31日をまたいだ費用の出し方をまとめています。
◈ API / SDK2026-08-16
Gemini 3.7 Flash の値上げ分は、バッチ層へ移すとちょうど相殺されます
Gemini 3.7 Flash の導入価格は2026年12月31日で終わり、翌日から単価が倍になります。値上げの対象になるモデルとならないモデルを価格表で切り分け、自分の使用量から年明けの請求を先に出すところまでを整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます