处理超大视频文件的 AI 理解一直是开发者的痛点——文件太大上传超时、base64 编码内存溢出、接口返回 413 错误。好消息是,Google 在 2026 年 1 月大幅提升了 Gemini API 的文件处理能力: 内联上传限制从 20MB 提升到 100MB,Files API 支持最大 2GB,还新增了 YouTube URL 直接分析功能。本文将详解这 3 种处理超大视频的方案,帮你选择最适合的技术路线。
核心价值: 读完本文,你将掌握处理 100MB 到 2GB 超大视频的完整方案,能够根据视频大小、使用频率和业务场景选择最优的上传方式。

Gemini 超大视频文件上传方案速览
在深入技术细节之前,先了解 Gemini 提供的三种视频上传方式:
| 上传方式 | 文件大小限制 | 适用场景 | 优势 | 局限 |
|---|---|---|---|---|
| Base64 内联 | ≤ 100MB | 小视频、快速测试 | 单次请求、代码简单 | 大文件内存压力大 |
| Files API | ≤ 2GB | 大视频、重复使用 | 支持超大文件、可复用 | 需要两步操作 |
| 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 视频理解方案一: 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" # 使用 API易 统一接口
)
# 通过 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 仍可正常分析。通过 API易 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 视频理解方案二: 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 供后续使用。通过 API易 apiyi.com 平台调用时,同样支持 Files API 的完整功能。

Gemini 视频理解方案三: 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" # API易 统一接口
)
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 视频理解 Token 计算与成本优化
理解 Token 计算规则对于控制成本至关重要。
Gemini 视频 Token 计算公式
| 分辨率 | 视频帧 | 音频 | 每秒总计 |
|---|---|---|---|
| 标准/高 | 258 tokens/帧 | 32 tokens/秒 | ~300 tokens/秒 |
| 低 (360p) | 66 tokens/帧 | 32 tokens/秒 | ~100 tokens/秒 |
不同时长视频的 Token 消耗
| 视频时长 | 标准分辨率 | 低分辨率 | 节省比例 |
|---|---|---|---|
| 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% token
response = client.chat.completions.create(
model="gemini-3-pro-preview",
messages=[...],
extra_body={
"media_resolution": "low" # 360p,100 tokens/秒
}
)
💰 成本优化: 对于内容理解类任务 (如视频摘要、内容分类),使用低分辨率通常足够。只有在需要识别细节 (如文字、小物体) 时才需要高分辨率。通过 API易 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 视频理解常见问题
Q1: 超过 2GB 的视频怎么处理?
超过 2GB 的视频有以下解决方案:
- 上传到 YouTube: 最推荐的方式,YouTube 支持最大 256GB 的视频,设为"不公开"即可保护隐私
- 视频压缩: 使用 FFmpeg 降低分辨率或码率
- 视频分割: 将长视频分割成多个片段分别分析
# 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
通过 API易 apiyi.com 平台调用时,支持所有标准的视频处理方式。
Q2: YouTube 私有视频能分析吗?
目前 Gemini API 不支持分析私有 (Private) 视频,但支持以下两种:
| 可见性 | 支持情况 | 说明 |
|---|---|---|
| 公开 (Public) | ✅ 支持 | 任何人可见 |
| 不公开 (Unlisted) | ✅ 支持 | 仅知道链接可见 |
| 私有 (Private) | ❌ 不支持 | 仅作者可见 |
建议: 如果视频涉及隐私,设为"不公开"是最佳选择,既能保护隐私又能使用 API 分析。
Q3: 如何分析视频的特定片段?
Gemini 支持两种方式指定视频片段:
方式一: 时间戳查询
prompt = "请分析视频 05:30 到 08:45 之间的内容"
方式二: 视频裁剪参数 (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 个技巧:
- 使用低分辨率: 设置
media_resolution: "low"可节省 67% token - 指定分析片段: 只分析需要的部分,避免全量处理
- 复用已上传文件: 通过 Files API 上传后保存 URI,避免重复上传
通过 API易 apiyi.com 调用 Gemini 视频理解,价格比官方更优惠,适合大量视频分析场景。
Gemini 超大视频处理方案总结

本文介绍了处理超大视频文件的 3 种完整方案:
| 方案 | 文件大小 | 最佳场景 | 复杂度 |
|---|---|---|---|
| Base64 内联 | ≤ 100MB | 快速测试、短视频 | ⭐ |
| Files API | ≤ 2GB | 私有大视频、重复分析 | ⭐⭐ |
| YouTube URL | 无限制 | 超长视频、公开内容 | ⭐ |
方案选择决策流程
视频是否已在 YouTube?
├── 是 → 使用 YouTube URL (最简单)
└── 否 → 视频大小?
├── ≤ 100MB → Base64 内联 (单次请求)
├── 100MB-2GB → Files API (支持复用)
└── > 2GB → 上传到 YouTube 或压缩/分割
🎯 最终建议: 对于超大视频文件,优先考虑 YouTube URL 方案,它不仅无文件大小限制,还能利用 Google 的原生集成实现最低延迟。推荐通过 API易 apiyi.com 调用 Gemini 视频理解功能,获得更优惠的价格和稳定的服务。
本文由 API易技术团队撰写。如需了解更多多模态 AI API 的使用技巧,欢迎访问 apiyi.com 获取技术支持。