Модели Gemini могут обрабатывать видео, позволяя многим передовым разработчикам использовать сценарии, которые исторически требовали бы доменно-специфических моделей. Некоторые из возможностей Gemini в области зрения включают способность:
- Описывайте, сегментируйте и извлекайте информацию из видео
- Ответьте на вопросы о видеоконтенте
- Ссылайтесь на конкретные временные метки в видео
Gemini изначально создавался как мультимодальный, и мы продолжаем расширять границы возможного. В этом руководстве показано, как использовать API Gemini для генерации текстовых ответов на основе видеовходов.
Видеовход
Вы можете предоставить видео в качестве входных данных для Gemini следующими способами:
- Загрузите видеофайл с помощью API File перед тем, как сделать запрос на
generateContent
. Используйте этот метод для файлов размером более 20 МБ, видео продолжительностью более 1 минуты или когда вы хотите повторно использовать файл в нескольких запросах. - Передайте встроенные видеоданные с запросом
generateContent
. Используйте этот метод для небольших файлов (<20 МБ) и более короткой продолжительности. - Включите URL-адрес YouTube непосредственно в запрос.
Загрузить видеофайл
Вы можете использовать API Files для загрузки видеофайла. Всегда используйте API Files, когда общий размер запроса (включая файл, текстовую подсказку, системные инструкции и т. д.) превышает 20 МБ, продолжительность видео значительна или если вы собираетесь использовать одно и то же видео в нескольких подсказках.
API файлов принимает форматы видеофайлов напрямую. В этом примере используется короткий фильм NASA "Jupiter's Great Red Spot Shrinks and Grows" . Кредит: Goddard Space Flight Center (GSFC)/David Ladd (2018).
«Большое Красное Пятно Юпитера уменьшается и растет» находится в открытом доступе и не показывает идентифицируемых людей. ( Правила использования изображений и медиаматериалов НАСА. )
Следующий код загружает пример видео, загружает его с помощью API файлов, ждет его обработки, а затем использует ссылку на файл в запросе generateContent
.
from google import genai
client = genai.Client(api_key="GOOGLE_API_KEY")
myfile = client.files.upload(file="path/to/sample.mp4")
response = client.models.generate_content(
model="gemini-2.0-flash", contents=[myfile, "Summarize this video. Then create a quiz with an answer key based on the information in this video."]
)
print(response.text)
import {
GoogleGenAI,
createUserContent,
createPartFromUri,
} from "@google/genai";
const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });
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-2.0-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();
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-2.0-flash",
contents,
nil,
)
fmt.Println(result.Text())
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?key=${GOOGLE_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-2.0-flash:generateContent?key=$GOOGLE_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
Дополнительную информацию о работе с медиафайлами см. в разделе Files API .
Передача видеоданных в линию
Вместо загрузки видеофайла с помощью API File вы можете передавать меньшие видео напрямую в запросе generateContent
. Это подходит для коротких видео с общим размером запроса менее 20 МБ.
Вот пример предоставления встроенных видеоданных:
# Only for videos of size <20Mb
video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()
response = client.models.generate_content(
model='models/gemini-2.0-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.')
]
)
)
import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";
const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });
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-2.0-flash",
contents: contents,
});
console.log(response.text);
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-2.0-flash:generateContent?key=$GOOGLE_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
Включите URL-адрес YouTube
API Gemini и AI Studio поддерживают URL-адреса YouTube как Part
данных файла. Вы можете включить URL-адрес YouTube с подсказкой, предлагающей модели суммировать, переводить или иным образом взаимодействовать с видеоконтентом.
Ограничения:
- На бесплатном уровне вы не можете загружать более 8 часов видео на YouTube в день.
- Для платного уровня ограничений по продолжительности видео нет.
- Для моделей до 2.5 можно загрузить только 1 видео на запрос. Для моделей после 2.5 можно загрузить максимум 10 видео на запрос.
- Вы можете загружать только общедоступные видео (не личные или не опубликованные видео).
В следующем примере показано, как включить URL-адрес YouTube в приглашение:
response = client.models.generate_content(
model='models/gemini-2.0-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.')
]
)
)
import { GoogleGenerativeAI } from "@google/generative-ai";
const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);
const model = genAI.getGenerativeModel({ model: "gemini-1.5-pro" });
const result = await model.generateContent([
"Please summarize the video in 3 sentences.",
{
fileData: {
fileUri: "https://www.youtube.com/watch?v=9hE5-98ZeCg",
},
},
]);
console.log(result.response.text());
package main
import (
"context"
"fmt"
"os"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, _ := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: os.Getenv("GOOGLE_API_KEY"),
Backend: genai.BackendGeminiAPI,
})
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-2.0-flash",
contents,
nil,
)
fmt.Println(result.Text())
}
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_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
Ссылайтесь на временные метки в содержании.
Вы можете задавать вопросы о конкретных моментах времени в видео, используя временные метки в формате MM:SS
.
prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?" # Adjusted timestamps for the NASA video
const prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?";
prompt := []*genai.Part{
genai.NewPartFromURI(currentVideoFile.URI, currentVideoFile.MIMEType),
// Adjusted timestamps for the NASA video
genai.NewPartFromText("What are the examples given at 00:05 and " +
"00:10 supposed to show us?"),
}
PROMPT="What are the examples given at 00:05 and 00:10 supposed to show us?"
Транскрибируйте видео и снабдите его визуальными описаниями
Модели Gemini могут транскрибировать и предоставлять визуальные описания видеоконтента, обрабатывая как звуковую дорожку, так и визуальные кадры. Для визуальных описаний модель производит выборку видео со скоростью 1 кадр в секунду . Эта частота выборки может влиять на уровень детализации описаний, особенно для видео с быстро меняющимися визуальными эффектами.
prompt = "Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions."
const prompt = "Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions.";
prompt := []*genai.Part{
genai.NewPartFromURI(currentVideoFile.URI, currentVideoFile.MIMEType),
genai.NewPartFromText("Transcribe the audio from this video, giving timestamps for salient events in the video. Also " +
"provide visual descriptions."),
}
PROMPT="Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions."
Настройте обработку видео
Вы можете настроить обработку видео в API Gemini, установив интервалы обрезки или указав пользовательскую выборку частоты кадров.
Установить интервалы обрезки
Вы можете обрезать видео, указав videoMetadata
со смещением начала и конца.
response = client.models.generate_content(
model='models/gemini-2.5-flash-preview-05-20',
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.')
]
)
)
Установите пользовательскую частоту кадров
Вы можете задать собственную частоту кадровой выборки, передав аргумент fps
в videoMetadata
.
# Only for videos of size <20Mb
video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()
response = client.models.generate_content(
model='models/gemini-2.5-flash-preview-05-20',
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.')
]
)
)
По умолчанию из видео выбирается 1 кадр в секунду (FPS). Возможно, вы захотите установить низкий FPS (< 1) для длинных видео. Это особенно полезно для в основном статичных видео (например, лекций). Если вы хотите захватить больше деталей в быстро меняющихся визуальных эффектах, рассмотрите возможность установки более высокого значения FPS.
Поддерживаемые форматы видео
Gemini поддерживает следующие типы видеоформатов MIME:
-
video/mp4
-
video/mpeg
-
video/mov
-
video/avi
-
video/x-flv
-
video/mpg
-
video/webm
-
video/wmv
-
video/3gpp
Технические подробности о видео
- Поддерживаемые модели и контекст : Все модели Gemini 2.0 и 2.5 могут обрабатывать видеоданные.
- Модели с контекстным окном 2 МБ могут обрабатывать видео длительностью до 2 часов при разрешении мультимедиа по умолчанию или 6 часов при низком разрешении мультимедиа, тогда как модели с контекстным окном 1 МБ могут обрабатывать видео длительностью до 1 часа при разрешении мультимедиа по умолчанию или 3 часа при низком разрешении мультимедиа.
- Обработка API файлов : при использовании API файлов видео считывается со скоростью 1 кадр в секунду (FPS), а аудио обрабатывается со скоростью 1 Кбит/с (один канал). Временные метки добавляются каждую секунду.
- Эти ставки могут быть изменены в будущем для улучшения вывода.
- Расчет токена : каждая секунда видео токенизируется следующим образом:
- Отдельные кадры (выборка 1 кадр/с):
- Если
mediaResolution
установлен на низкое значение, кадры токенизируются по 66 токенов на кадр. - В противном случае кадры токенизируются по 258 токенов на кадр.
- Если
- Аудио: 32 токена в секунду.
- Метаданные также включены.
- Всего: приблизительно 300 токенов в секунду видео при разрешении мультимедиа по умолчанию или 100 токенов в секунду видео при низком разрешении мультимедиа.
- Отдельные кадры (выборка 1 кадр/с):
- Формат временной метки : при указании определенных моментов видео в подсказке используйте формат
MM:SS
(например,01:15
для 1 минуты и 15 секунд). - Лучшие практики :
- Для достижения оптимальных результатов используйте только одно видео на каждый запрос.
- При объединении текста и одного видео поместите текстовую подсказку после видеочасти в массиве
contents
. - Имейте в виду, что быстрые последовательности действий могут потерять детали из-за частоты дискретизации 1 FPS. Рассмотрите возможность замедления таких клипов, если это необходимо.
Что дальше?
В этом руководстве показано, как загружать видеофайлы и генерировать текстовые выходы из видеовходов. Чтобы узнать больше, см. следующие ресурсы:
- Системные инструкции : Системные инструкции позволяют вам управлять поведением модели в зависимости от ваших конкретных потребностей и вариантов использования.
- API файлов : узнайте больше о загрузке и управлении файлами для использования с Gemini.
- Стратегии подсказок файлов : API Gemini поддерживает подсказки с текстом, изображениями, аудио- и видеоданными, также известные как мультимодальные подсказки.
- Руководство по безопасности : Иногда генеративные модели ИИ выдают неожиданные результаты, например, неточные, предвзятые или оскорбительные. Постобработка и человеческая оценка имеют важное значение для ограничения риска вреда от таких результатов.