如需了解视频生成,请参阅 Gemini Omni Flash 指南。
Gemini 模型可以处理视频,从而实现许多前沿开发者用例,而这些用例在过去需要使用特定于领域的模型。 Gemini 的一些视觉功能包括:能够描述视频、对视频进行分段和提取视频中的信息、回答有关视频内容的问题,以及引用视频中的特定时间戳。
您可以通过以下方式向 Gemini 提供视频作为输入:
| 输入法 | 最大大小 | 推荐的使用场景 |
|---|---|---|
| File API | 20GB(付费)/ 2GB(免费) | 大型文件(100MB+)、长视频(10 分钟以上)、可重复使用的文件。 |
| Cloud Storage 注册 | 2GB(每个文件,无存储空间限制) | 大型文件(100MB+)、长视频(10 分钟以上)、持久性文件、可重复使用的文件。 |
| 内嵌数据 | < 100MB | 小型文件(<100MB)、时长较短(<1 分钟)、一次性输入。 |
| YouTube 网址 | 不适用 | 公开 YouTube 视频。 |
注意:建议在大多数使用场景中使用 File API,尤其是对于大于 100MB 的文件,或者当您想在多个请求中重复使用文件时。
如需了解其他文件输入方法(例如使用外部网址或存储在 Google Cloud 中的文件),请参阅 文件输入方法指南。
上传视频文件
以下代码会下载示例视频,使用 Files API 上传该视频, 等待视频处理完毕,然后使用上传的文件引用来 总结视频。
Python
from google import genai
client = genai.Client()
myfile = client.files.upload(file="path/to/sample.mp4")
response = client.models.generate_content(
model="gemini-3.8-flash", contents=[myfile, "Summarize this video. Then create a quiz with an answer key based on the information in this video."]
)
print(response.text)
JavaScript
import {
GoogleGenAI,
createUserContent,
createPartFromUri,
} from "@google/genai";
const ai = new GoogleGenAI({});
async function main() {
const myfile = await ai.files.upload({
file: "path/to/sample.mp4",
config: { mimeType: "video/mp4" },
});
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: createUserContent([
createPartFromUri(myfile.uri, myfile.mimeType),
"Summarize this video. Then create a quiz with an answer key based on the information in this video.",
]),
});
console.log(response.text);
}
await main();
Go
uploadedFile, _ := client.Files.UploadFromPath(ctx, "path/to/sample.mp4", nil)
parts := []*genai.Part{
genai.NewPartFromText("Summarize this video. Then create a quiz with an answer key based on the information in this video."),
genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-3.8-flash",
contents,
nil,
)
fmt.Println(result.Text())
REST
VIDEO_PATH="path/to/sample.mp4"
MIME_TYPE=$(file -b --mime-type "${VIDEO_PATH}")
NUM_BYTES=$(wc -c < "${VIDEO_PATH}")
DISPLAY_NAME=VIDEO
tmp_header_file=upload-header.tmp
echo "Starting file upload..."
curl "https://generativelanguage.googleapis.com/upload/v1beta/files" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-D ${tmp_header_file} \
-H "X-Goog-Upload-Protocol: resumable" \
-H "X-Goog-Upload-Command: start" \
-H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
-H "Content-Type: application/json" \
-d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null
upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"
echo "Uploading video data..."
curl "${upload_url}" \
-H "Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Offset: 0" \
-H "X-Goog-Upload-Command: upload, finalize" \
--data-binary "@${VIDEO_PATH}" 2> /dev/null > file_info.json
file_uri=$(jq -r ".file.uri" file_info.json)
echo file_uri=$file_uri
echo "File uploaded successfully. File URI: ${file_uri}"
# --- 3. Generate content using the uploaded video file ---
echo "Generating content from video..."
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"file_data":{"mime_type": "'"${MIME_TYPE}"'", "file_uri": "'"${file_uri}"'"}},
{"text": "Summarize this video. Then create a quiz with an answer key based on the information in this video."}]
}]
}' 2> /dev/null > response.json
jq -r ".candidates[].content.parts[].text" response.json
如需优化 token 效率和性能,请考虑使用 智能体视频处理。
当总请求大小(包括文件、文本提示、系统说明等)超过 20 MB、视频时长较长,或者您打算在多个提示中使用同一视频时,请务必使用 Files API。 File API 直接接受视频文件格式。
如需详细了解如何使用媒体文件,请参阅 Files API。
以内嵌方式传递视频数据
您可以直接在对 generateContent 的请求中传递较小的视频,而无需使用 File API 上传视频文件。此方法适用于总请求大小不超过 20 MB 的较短视频。
以下是提供内嵌视频数据的示例:
Python
from google import genai
from google.genai import types
# Only for videos of size <20Mb
video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()
client = genai.Client()
response = client.models.generate_content(
model='gemini-3.8-flash',
contents=types.Content(
parts=[
types.Part(
inline_data=types.Blob(data=video_bytes, mime_type='video/mp4')
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
print(response.text)
JavaScript
import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";
const ai = new GoogleGenAI({});
const base64VideoFile = fs.readFileSync("path/to/small-sample.mp4", {
encoding: "base64",
});
const contents = [
{
inlineData: {
mimeType: "video/mp4",
data: base64VideoFile,
},
},
{ text: "Please summarize the video in 3 sentences." }
];
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: contents,
});
console.log(response.text);
REST
VIDEO_PATH=/path/to/your/video.mp4
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{
"inline_data": {
"mime_type":"video/mp4",
"data": "'$(base64 $B64FLAGS $VIDEO_PATH)'"
}
},
{"text": "Please summarize the video in 3 sentences."}
]
}]
}' 2> /dev/null
传递 YouTube 网址
您可以将 YouTube 网址直接传递给 Gemini API,作为请求的一部分,如下所示:
Python
from google import genai
from google.genai import types
client = genai.Client()
response = client.models.generate_content(
model='gemini-3.8-flash',
contents=types.Content(
parts=[
types.Part(
file_data=types.FileData(file_uri='https://www.youtube.com/watch?v=9hE5-98ZeCg')
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
print(response.text)
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const contents = [
{
fileData: {
fileUri: "https://www.youtube.com/watch?v=9hE5-98ZeCg",
},
},
{ text: "Please summarize the video in 3 sentences." }
];
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: contents,
});
console.log(response.text);
Go
package main
import (
"context"
"fmt"
"os"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
parts := []*genai.Part{
genai.NewPartFromText("Please summarize the video in 3 sentences."),
genai.NewPartFromURI("https://www.youtube.com/watch?v=9hE5-98ZeCg","video/mp4"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-3.8-flash",
contents,
nil,
)
fmt.Println(result.Text())
}
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"text": "Please summarize the video in 3 sentences."},
{
"file_data": {
"file_uri": "https://www.youtube.com/watch?v=9hE5-98ZeCg"
}
}
]
}]
}' 2> /dev/null
限制 :
- 对于免费层级,您每天上传的 YouTube 视频时长不得超过 8 小时。
- 对于付费层级,没有基于视频时长的限制。
- 对于 Gemini 2.5 之前的模型,您每次请求只能上传 1 个视频。对于 Gemini 2.5 及更高版本的模型,您每次请求最多能上传 10 个视频。
- 您只能上传公开视频(不能上传私享视频或未公开列出的视频)。
智能体视频理解
默认情况下,视频输入在所有模型(包括 Gemini 4)中使用静态处理(以 1 FPS 的速率提取帧)。 Gemini 4 Argon、3.8 Flash、3.6 Flash 和 3.5 Flash Lite 模型还支持 智能体视频理解,这是一种选择启用模式,在该模式下,模型会动态探索视频 时间轴,有选择地检查脚本,并根据提示动态调整帧 速率和分辨率。
| Mode | 说明 | 支持的模型 |
|---|---|---|
| 静态 (默认) | 以固定速率 (1 FPS) 提取帧,并一次性将这些帧放入上下文中。所有 Gemini 模型(包括 Gemini 4)的默认设置。 | 所有 Gemini 模型 |
| 智能体 | 模型会动态浏览视频时间轴,仅加载提示所需的内容。对于长篇内容,token 效率最多可提高 88%,质量最多可提高 7%。 | Gemini 4 Argon、3.8 Flash、3.6 Flash、3.5 Flash Lite |
选择处理模式
选择与您的视频时长和查询类型相匹配的处理模式:
- 静态(默认) :最适合短视频片段(5 分钟以内)、广泛的全视频摘要(整个录制内容都相关)、对延迟敏感的查询,或整个视频片段的帧级精度。对于需要检查大部分视频的短视频或广泛提示,静态处理可避免时间轴导航产生的额外思考 token (
thoughts_token_count) 和工具调用往返 (tool_use_prompt_token_count)。 - 智能体 :最适合长视频(5-10 分钟以上)、大海捞针式检索,或针对特定时刻或主题的查询。模型会先检查脚本,然后根据需要仅加载相关的视觉片段,从而将视频输入 token 用量减少多达 88%,而无需填充上下文窗口。
注意 :对于智能体处理需要较长时间的长视频或复杂提示,请使用流式传输 (
client.models.generate_content_stream)。这样可以保持连接处于活动状态,显示中间推理步骤,并避免连接或身份验证超时。
设置处理模式
Python
import time
from google import genai
from google.genai import types
client = genai.Client()
video_file = client.files.upload(file="path/to/lecture.mp4")
while video_file.state.name == "PROCESSING":
time.sleep(2)
video_file = client.files.get(name=video_file.name)
response = client.models.generate_content(
model="gemini-3.8-flash",
contents=[
types.Part.from_uri(
file_uri=video_file.uri,
mime_type=video_file.mime_type,
media_processing="AGENTIC",
),
"What are the three main arguments presented?",
],
)
print(response.text)
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
let videoFile = await ai.files.upload({
file: "path/to/lecture.mp4",
config: { mimeType: "video/mp4" },
});
while (videoFile.state === "PROCESSING") {
await new Promise((resolve) => setTimeout(resolve, 2000));
videoFile = await ai.files.get({ name: videoFile.name });
}
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: [
{
role: "user",
parts: [
{
fileData: {
fileUri: videoFile.uri,
mimeType: videoFile.mimeType,
},
mediaProcessing: "AGENTIC",
},
{ text: "What are the three main arguments presented?" },
],
},
],
});
console.log(response.text);
Go
uploadedFile, _ := client.Files.UploadFromPath(ctx, "path/to/lecture.mp4", nil)
parts := []*genai.Part{
{
FileData: &genai.FileData{
FileURI: uploadedFile.URI,
MIMEType: uploadedFile.MIMEType,
},
MediaProcessing: genai.MediaProcessingAgentic,
},
genai.NewPartFromText("What are the three main arguments presented?"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-3.8-flash",
contents,
nil,
)
fmt.Println(result.Text())
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [{
"parts": [
{
"file_data": {
"file_uri": "'${file_uri}'",
"mime_type": "video/mp4"
},
"media_processing": "AGENTIC"
},
{"text": "What are the three main arguments presented?"}
]
}]
}'
注意 :如需验证是否使用了智能体处理,请检查
response.candidates[0].content.parts。如果存在tool_call和tool_response部分且MEDIA_PROCESSING工具类型,则表示模型动态浏览了视频。
注意 :与其他服务器端工具(例如 Google 搜索或网址上下文)不同,智能体视频不需要在
ToolConfig中设置include_server_side_tool_invocations=True,即可返回或流式传输工具调用和结果。当在任何输入部分设置media_processing="AGENTIC"时,系统会自动返回视频导航的tool_call和tool_response部分。
响应结构
启用智能体处理后,响应会包含显示内部导航轨迹的其他部分:
tool_call部分 (tool_type: "MEDIA_PROCESSING"):每次模型请求视频片段或音频脚本时发出。tool_response部分 (tool_type: "MEDIA_PROCESSING"):每次加载操作的结果。
您无需手动处理或回复这些部分:将完整响应作为对话历史记录传递回去,系统会自动处理这些部分。
如果在 ThinkingConfig 中设置了 include_thoughts=True,推理步骤会显示为与工具调用/响应对交错的 thought: true 部分。如果停用了思考,则会省略思考文本,但工具部分仍然存在。
以下示例展示了包含交错的工具调用和响应部分的响应载荷:
{
"candidates": [
{
"content": {
"role": "model",
"parts": [
{
"thought": true,
"text": "Inspecting transcript for key discussion topics..."
},
{
"thought_signature": "sig_A",
"tool_call": {
"tool_type": "MEDIA_PROCESSING"
}
},
{
"thought_signature": "sig_B",
"tool_response": {
"tool_type": "MEDIA_PROCESSING"
}
},
{
"thought": true,
"text": "Loading visual frames to verify slide content..."
},
{
"thought_signature": "sig_C",
"tool_call": {
"tool_type": "MEDIA_PROCESSING"
}
},
{
"thought_signature": "sig_D",
"tool_response": {
"tool_type": "MEDIA_PROCESSING"
}
},
{
"thought": true,
"text": "Synthesizing answer from gathered evidence..."
},
{
"text": "The three main arguments presented in the lecture are...",
"thought_signature": "sig_E"
}
]
}
}
]
}
在不同视频之间混合处理模式
您可以为同一请求中的每个视频部分设置不同的处理模式:
Python
from google import genai
from google.genai import types
client = genai.Client()
lecture = client.files.upload(file="path/to/long-lecture.mp4")
experiment = client.files.upload(file="path/to/short-experiment.mp4")
response = client.models.generate_content(
model="gemini-3.8-flash",
contents=[
types.Part.from_uri(
file_uri=lecture.uri,
mime_type=lecture.mime_type,
media_processing="AGENTIC", # Use agentic video understanding
),
types.Part.from_uri(
file_uri=experiment.uri,
mime_type=experiment.mime_type,
media_processing="STATIC", # Use static processing
),
"Compare the lecture content with the experiment results.",
],
)
print(response.text)
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const lecture = await ai.files.upload({
file: "path/to/long-lecture.mp4",
config: { mimeType: "video/mp4" },
});
const experiment = await ai.files.upload({
file: "path/to/short-experiment.mp4",
config: { mimeType: "video/mp4" },
});
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: [
{
role: "user",
parts: [
{
fileData: {
fileUri: lecture.uri,
mimeType: lecture.mimeType,
},
mediaProcessing: "AGENTIC", // Use agentic video understanding
},
{
fileData: {
fileUri: experiment.uri,
mimeType: experiment.mimeType,
},
mediaProcessing: "STATIC", // Use static processing
},
{ text: "Compare the lecture content with the experiment results." },
],
},
],
});
console.log(response.text);
Go
lecturePart := &genai.Part{
FileData: &genai.FileData{
FileURI: lectureFile.URI,
MIMEType: lectureFile.MIMEType,
},
MediaProcessing: genai.MediaProcessingAgentic, // Use agentic
}
experimentPart := &genai.Part{
FileData: &genai.FileData{
FileURI: experimentFile.URI,
MIMEType: experimentFile.MIMEType,
},
MediaProcessing: genai.MediaProcessingStatic, // Use static
}
parts := []*genai.Part{
lecturePart,
experimentPart,
genai.NewPartFromText("Compare the lecture content with the experiment results."),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(ctx, "gemini-3.8-flash", contents, nil)
fmt.Println(result.Text())
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [{
"parts": [
{
"file_data": {
"file_uri": "'${lecture_uri}'",
"mime_type": "video/mp4"
},
"media_processing": "AGENTIC"
},
{
"file_data": {
"file_uri": "'${experiment_uri}'",
"mime_type": "video/mp4"
},
"media_processing": "STATIC"
},
{"text": "Compare the lecture content with the experiment results."}
]
}]
}'
对长视频使用上下文缓存
对于时长超过 10 分钟的视频,或者当您计划针对同一视频文件发出多个请求 时,请使用 上下文缓存 来 降低费用并缩短延迟时间。借助上下文缓存,您可以处理一次视频,并在后续查询中重复使用 token,因此非常适合聊天会话或对长篇内容进行重复分析。
引用内容中的时间戳
您可以使用 MM:SS 格式的时间戳,针对视频中的特定时间点提出问题。
Python
response = client.models.generate_content(
model="gemini-3.8-flash",
contents=[
myfile,
"What are the examples given at 00:05 and 00:10 supposed to show us?",
],
)
print(response.text)
JavaScript
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: [
myfile,
"What are the examples given at 00:05 and 00:10 supposed to show us?",
],
});
console.log(response.text);
Go
parts := []*genai.Part{
genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
genai.NewPartFromText("What are the examples given at 00:05 and 00:10 supposed to show us?"),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-3.8-flash",
[]*genai.Content{genai.NewContentFromParts(parts, genai.RoleUser)},
nil,
)
fmt.Println(result.Text())
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"file_data": {"file_uri": "'"${file_uri}"'", "mime_type": "'"${MIME_TYPE}"'"}},
{"text": "What are the examples given at 00:05 and 00:10 supposed to show us?"}
]
}]
}' 2> /dev/null
从视频中提取详细的数据洞见
Gemini 模型通过处理音频和视觉 流中的信息,提供强大的视频内容理解功能。这样,您就可以提取丰富的信息,包括生成视频中发生情况的说明,以及回答有关视频内容的问题。
对于视觉说明,模型会以 1 帧/秒 (FPS) 的速率对视频进行采样。此默认采样率适用于大多数内容,但请注意,它可能会遗漏快速动作或快速场景变化的视频中的细节。 对于此类高动作内容,请考虑设置自定义帧速率。
Python
response = client.models.generate_content(
model="gemini-3.8-flash",
contents=[
myfile,
"Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments.",
],
)
print(response.text)
JavaScript
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: [
myfile,
"Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments.",
],
});
console.log(response.text);
Go
parts := []*genai.Part{
genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
genai.NewPartFromText("Describe the key events in this video, providing both audio and visual details. " +
"Include timestamps for salient moments."),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-3.8-flash",
[]*genai.Content{genai.NewContentFromParts(parts, genai.RoleUser)},
nil,
)
fmt.Println(result.Text())
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"file_data": {"file_uri": "'"${file_uri}"'", "mime_type": "'"${MIME_TYPE}"'"}},
{"text": "Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments."}
]
}]
}' 2> /dev/null
自定义视频处理
您可以在 Gemini API 中通过设置剪辑间隔或提供自定义帧速率选段来自定义视频处理。这些自定义选项
仅在 "static" 模式下处理视频时受支持。
设置剪辑间隔
您可以通过指定包含开始和结束偏移量的 videoMetadata 来剪辑视频。
Python
from google import genai
from google.genai import types
client = genai.Client()
response = client.models.generate_content(
model='models/gemini-3.8-flash',
contents=types.Content(
parts=[
types.Part(
file_data=types.FileData(file_uri='https://www.youtube.com/watch?v=XEzRZ35urlk'),
video_metadata=types.VideoMetadata(
start_offset='1250s',
end_offset='1570s'
)
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
JavaScript
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-3.8-flash';
async function main() {
const contents = [
{
role: 'user',
parts: [
{
fileData: {
fileUri: 'https://www.youtube.com/watch?v=9hE5-98ZeCg',
mimeType: 'video/*',
},
videoMetadata: {
startOffset: '40s',
endOffset: '80s',
}
},
{
text: 'Please summarize the video in 3 sentences.',
},
],
},
];
const response = await ai.models.generateContent({
model,
contents,
});
console.log(response.text)
}
await main();
设置自定义帧速率
您可以通过向 videoMetadata 传递 fps 实参来设置自定义帧速率选段。
Python
from google import genai
from google.genai import types
# Only for videos of size <20Mb
video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()
client = genai.Client()
response = client.models.generate_content(
model='models/gemini-3.8-flash',
contents=types.Content(
parts=[
types.Part(
inline_data=types.Blob(
data=video_bytes,
mime_type='video/mp4'),
video_metadata=types.VideoMetadata(fps=5)
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
JavaScript
import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({});
const myfile = await ai.files.upload({
file: "path/to/sample.mp4",
mimeType: "video/mp4",
});
const response = await ai.models.generateContent({
model: "gemini-3.8-flash",
contents: [
{
fileData: {
fileUri: myfile.uri,
mimeType: myfile.mimeType,
},
videoMetadata: {
fps: 5,
},
},
"Please summarize the video in 3 sentences.",
],
});
console.log(response.text);
默认情况下,系统会按 1 每秒帧数 (FPS) 的速率从视频中提取选段。对于长视频,您可能需要设置较低的 FPS(低于 1)。这对于偏静态的视频(例如讲座)尤其有用。对于需要精细时间分析(例如快速动作理解或高速动作追踪)的视频,请使用更高的 FPS。
支持的视频格式
Gemini 支持以下视频格式 MIME 类型:
video/mp4video/mpegvideo/quicktimevideo/avivideo/x-flvvideo/mpgvideo/webmvideo/wmvvideo/3gpp
有关视频技术方面的详细信息
- 支持的模型和上下文:所有 Gemini 模型都可以处理视频数据。
- 上下文窗口为 100 万个 token 的模型默认可以处理时长不超过 3 小时(低媒体分辨率)的视频,或者时长不超过 1 小时(高媒体分辨率)的视频。
- 处理模式:Gemini 4 Argon、3.8 Flash、3.6 Flash、3.5 Flash Lite、
及更高版本的模型支持两种视频处理模式:
- 静态:以 1 FPS 的速率提取帧,并将其放入上下文中(所有模型的默认设置 )。音频的处理速率为 1Kbps(单声道)。 每秒都会添加时间戳。最适合短视频片段或每个帧都很重要的情况(例如逐帧检查)。请注意,如果采样率为 1 FPS,快速动作序列可能会丢失细节。
- 智能体:模型会动态浏览视频,并根据需要加载
脚本和/或帧和/或音频。对于长篇内容,此模式使用的 token 最多可减少 88%,但由于内部推理和工具往返,对于短视频片段(<5 分钟)或广泛查询,导航可能会增加首次 token 的时间 (TTFT) 和总 token 用量。
响应包含
MEDIA_PROCESSING工具调用和响应部分,以在不同轮次之间保留推理上下文。最适合长视频和定向查询,以优化 token 费用和响应质量。在 Gemini 4 Argon、3.8 Flash、3.6 Flash 和 3.5 Flash Lite 上受支持。如需了解详情,请参阅 智能体视频理解。
- token 计算(静态模式):视频的每一秒都按如下方式计算 token:
- 各帧(选段率为 1 FPS):
- 如果
media_resolution设置为低,则每帧按 66 个 token 计算。 - 否则,每帧按 258 个 token 计算。
- 如果
- 音频:每秒 32 个 token。
- 元数据也包含在内。
- 总计:默认(低)媒体分辨率下,每秒视频大约需要 100 个 token;高媒体分辨率下,每秒视频大约需要 300 个 token。
- 各帧(选段率为 1 FPS):
- token 计算(智能体模式):token 用量因内容
复杂性和模型的导航策略而异。在视频探索期间生成的导航推理 token
计为思考 token
(
thoughts_token_count),而根据需要加载的帧、音频和脚本则计为工具提示 token (tool_use_prompt_token_count)。 对于长篇内容,智能体处理通常比静态处理使用的总 token 最多减少 88%,因为模型仅加载回答提示所需的脚本和/或帧和/或音频(请参阅 token 指南)。 - 媒体分辨率:Gemini 3 引入了使用
media_resolution参数对多模态 视觉处理进行精细控制的功能。media_resolution参数用于确定为每个输入图片或视频帧分配的 token 数量上限 。分辨率越高,模型读取精细文本或识别小细节的能力就越强,但 token 用量和延迟时间也会增加。media_resolution和media_processing参数是独立的:您可以在同一视频部分中同时设置这两个参数。
如需详细了解 token 计算,请参阅 token 指南。
- 时间戳格式:在提示中引用视频中的特定时刻时,请使用
MM:SS格式(例如,01:15表示 1 分 15 秒)。 - 提示位置:如果将文本与单个视频相结合,请在
contents数组中将文本提示放在视频部分 之后。 - 长时间请求的超时:对于需要较长处理时间或复杂的多步推理的视频,请使用流式传输
(
client.models.generate_content_stream)。在高需求下遇到后端重试的同步非流式传输请求可能会超出连接或身份验证 token 有效期窗口,这可能会显示为意外的401 Unauthorized或超时错误。流式传输可保持连接处于活动状态,并显示中间推理和工具调用进度。