Видео понимание

Чтобы узнать больше о создании видео, ознакомьтесь с руководством по Gemini Omni Flash .

Модели Gemini способны обрабатывать видео, что открывает множество новых возможностей для разработчиков, которые ранее требовали использования специализированных моделей. К числу возможностей Gemini в области компьютерного зрения относятся: описание, сегментация и извлечение информации из видео, ответы на вопросы о содержании видео и указание на конкретные временные метки в видео.

Вы можете предоставлять видеоматериалы для Gemini следующими способами:

Метод ввода Максимальный размер Рекомендуемый вариант использования
Файловый API 20 ГБ (платно) / 2 ГБ (бесплатно) Большие файлы (100 МБ и более), длинные видеоролики (10 мин и более), файлы для многократного использования.
Регистрация в облачном хранилище 2 ГБ (на файл, без ограничений по объему хранилища) Большие файлы (100 МБ и более), длинные видеоролики (10 мин и более), файлы, сохраняемые и используемые повторно.
Встроенные данные < 100 МБ Небольшие файлы (<100 МБ), короткая продолжительность (<1 мин), одноразовые входные данные.
URL-адреса YouTube Н/Д Общедоступные видео на YouTube.

Примечание: API для работы с файлами рекомендуется использовать в большинстве случаев, особенно для файлов размером более 100 МБ или когда необходимо повторно использовать файл в нескольких запросах.

Чтобы узнать о других методах ввода файлов, таких как использование внешних URL-адресов или файлов, хранящихся в Google Cloud, см. руководство по методам ввода файлов .

Загрузите видеофайл

Приведенный ниже код загружает образец видео, выгружает его через Files API , ожидает обработки, а затем использует ссылку на загруженный файл для составления краткого описания видео.

Python

from google import genai
import time

client = genai.Client()

myfile = client.files.upload(file="path/to/sample.mp4")

while not myfile.state or myfile.state.name != "ACTIVE":
    print("Processing video...")
    time.sleep(5)
    myfile = client.files.get(name=myfile.name)

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {"type": "video", "uri": myfile.uri, "mime_type": myfile.mime_type},
        {"type": "text", "text": "Summarize this video. Then create a quiz with an answer key based on the information in this video."}
    ]
)

print(interaction.output_text)

JavaScript

import { GoogleGenAI } 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" },
  });

  let getFile = await ai.files.get({ name: myfile.name });
  while (getFile.state === 'PROCESSING') {
      getFile = await ai.files.get({ name: myfile.name });
      console.log(`current file status: ${getFile.state}`);
      console.log('File is still processing, retrying in 5 seconds');

      await new Promise((resolve) => {
          setTimeout(resolve, 5000);
      });
  }
  if (getFile.state === 'FAILED') {
      throw new Error('File processing failed.');
  }

  const interaction = await ai.interactions.create({
    model: "gemini-3.8-flash",
    input: [
      { type: "video", uri: myfile.uri, mime_type: myfile.mimeType },
      { type: "text", text: "Summarize this video. Then create a quiz with an answer key based on the information in this video." }
    ],
  });
  console.log(interaction.output_text);
}

await main();

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.VideoContent;
import com.google.genai.gaos.models.interactions.VideoContentMimeType;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.List;

Client client = new Client();

Content textContent = TextContent.builder().text("Summarize the key events in this video.").build();
Content videoContent =
    VideoContent.builder()
        .uri("gs://cloud-samples-data/generative-ai/video/pixel8.mp4")
        .mimeType(VideoContentMimeType.VIDEO_MP4)
        .build();

List<Content> contents = Arrays.asList(textContent, videoContent);

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.ofContent(contents))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

ОТДЫХ

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)
file_name=$(jq -r ".file.name" file_info.json)
echo file_uri=$file_uri

echo "File uploaded successfully. File URI: ${file_uri}"

# Polling loop
echo "Waiting for file to be processed..."
while true; do
  curl -s "https://generativelanguage.googleapis.com/v1beta/${file_name}" \
    -H "x-goog-api-key: $GEMINI_API_KEY" > file_status.json
  state=$(jq -r ".state" file_status.json)
  echo "Current state: $state"
  if [ "$state" == "ACTIVE" ]; then
    break
  elif [ "$state" == "FAILED" ]; then
    echo "File processing failed."
    exit 1
  fi
  sleep 5
done

echo "Generating content from video..."
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "gemini-3.8-flash",
      "input": [
        {"type": "video", "uri": "'${file_uri}'", "mime_type": "'${MIME_TYPE}'"},
        {"type": "text", "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 ".steps[].content[0].text" response.json

Всегда используйте Files API, если общий размер запроса (включая файл, текстовое сообщение, системные инструкции и т. д.) превышает 20 МБ, длительность видео значительна или если вы планируете использовать одно и то же видео в нескольких сообщениях. File API принимает видеофайлы напрямую.

Чтобы узнать больше о работе с медиафайлами, см. раздел «API файлов» .

Передача видеоданных в режиме реального времени.

Вместо загрузки видеофайла с помощью File API вы можете передавать в запросе видео меньшего размера. Это подходит для коротких видеороликов общим размером менее 20 МБ.

Вот пример предоставления видеоданных непосредственно в видеофайле:

Python

from google import genai
import base64

video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()

client = genai.Client()
interaction = client.interactions.create(
    model='gemini-3.8-flash',
    input=[
        {"type": "text", "text": "Please summarize the video in 3 sentences."},
        {
            "type": "video",
            "data": base64.b64encode(video_bytes).decode('utf-8'),
            "mime_type": "video/mp4"
        }
    ]
)
print(interaction.output_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 interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    { type: "text", text: "Please summarize the video in 3 sentences." },
    {
      type: "video",
      data: base64VideoFile,
      mime_type: "video/mp4",
    }
  ],
});
console.log(interaction.output_text);

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.VideoContent;
import com.google.genai.gaos.models.interactions.VideoContentMimeType;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.List;

Client client = new Client();

Content textContent = TextContent.builder().text("Summarize the key events in this video.").build();
Content videoContent =
    VideoContent.builder()
        .uri("gs://cloud-samples-data/generative-ai/video/pixel8.mp4")
        .mimeType(VideoContentMimeType.VIDEO_MP4)
        .build();

List<Content> contents = Arrays.asList(textContent, videoContent);

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.ofContent(contents))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

ОТДЫХ

VIDEO_PATH=/path/to/your/video.mp4

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "gemini-3.8-flash",
      "input": [
        {"type": "text", "text": "Please summarize the video in 3 sentences."},
        {
          "type": "video",
          "data": "'$(base64 $B64FLAGS $VIDEO_PATH)'",
          "mime_type": "video/mp4"
        }
      ]
    }' 2> /dev/null

Передайте URL-адреса YouTube

Вы можете передавать URL-адреса YouTube непосредственно в API Gemini в рамках вашего запроса следующим образом:

Python

from google import genai

client = genai.Client()
interaction = client.interactions.create(
    model='gemini-3.8-flash',
    input=[
        {"type": "text", "text": "Please summarize the video in 3 sentences."},
        {
            "type": "video",
            "uri": "https://www.youtube.com/watch?v=9hE5-98ZeCg"
        }
    ]
)
print(interaction.output_text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    { type: "text", text: "Please summarize the video in 3 sentences." },
    {
      type: "video",
      uri: "https://www.youtube.com/watch?v=9hE5-98ZeCg",
    }
  ],
});
console.log(interaction.output_text);

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.VideoContent;
import com.google.genai.gaos.models.interactions.VideoContentMimeType;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.List;

Client client = new Client();

Content textContent = TextContent.builder().text("Summarize the key events in this video.").build();
Content videoContent =
    VideoContent.builder()
        .uri("gs://cloud-samples-data/generative-ai/video/pixel8.mp4")
        .mimeType(VideoContentMimeType.VIDEO_MP4)
        .build();

List<Content> contents = Arrays.asList(textContent, videoContent);

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.ofContent(contents))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "gemini-3.8-flash",
      "input": [
        {"type": "text", "text": "Please summarize the video in 3 sentences."},
        {
          "type": "video",
          "uri": "https://www.youtube.com/watch?v=9hE5-98ZeCg"
        }
      ]
    }' 2> /dev/null

Ограничения:

  • В бесплатном тарифе вы не можете загружать на YouTube более 8 часов видео в день.
  • Для платного тарифа ограничений по длине видео нет.
  • Для моделей, выпущенных до Gemini 2.5, можно загрузить только 1 видео за один запрос. Для моделей Gemini 2.5 и более поздних версий можно загрузить максимум 10 видео за один запрос.
  • Вы можете загружать только общедоступные видео (не частные или скрытые видео).

Понимание агентного видео

По умолчанию для видеовходов используется статическая обработка (извлечение кадров со скоростью 1 кадр в секунду). Модели Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash и 3.5 Flash Lite также поддерживают агентное понимание видео , при котором модель динамически исследует временную шкалу видео, выборочно проверяя текстовые фрагменты и адаптивно регулируя частоту кадров и разрешение в режиме реального времени на основе запроса.

Режим Описание Поддерживаемые модели
Статический (по умолчанию) Извлекает кадры с фиксированной частотой (1 кадр в секунду) и помещает их в контекст за один проход. Хорошо подходит для коротких видеороликов. Все модели Gemini
Агентский Модель динамически перемещается по временной шкале видео, загружая только необходимый контент в соответствии с запросом. Это обеспечивает до 88% большую эффективность использования токенов и примерно на 7% более высокое качество для длинных видеороликов. Вспышки Gemini 3.8, 3.7, 3.6, 3.5 Flash Lite

Выберите режим обработки

В качестве общего правила, начинайте с агентного режима, особенно при оптимизации качества ответов или эффективности использования токенов.

  • Agentic: Длинные видеоролики или запросы, нацеленные на определенные моменты. Модель динамически перемещается по временной шкале, чтобы нацеливаться на контекстно релевантную информацию, не заполняя контекстное окно.
  • Статический режим: запросы, чувствительные к задержке, для коротких видеороликов (менее 5 минут) или случаи, когда требуется точность на уровне кадров по всему видеоролику.

Примечание: Для длинных видеороликов или сложных запросов, где обработка агентом занимает больше времени, используйте потоковую передачу ( stream=True ) или фоновое выполнение ( background=True ). Это поддерживает соединение активным, отображает промежуточные этапы обработки и предотвращает тайм-ауты соединения или аутентификации.

Установить режим обработки

Python

import time
from google import genai

client = genai.Client()

# Upload a long video
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)

# Use agentic processing
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "video",
            "uri": video_file.uri,
            "mime_type": video_file.mime_type,
            "processing": "agentic"
        },
        {"type": "text", "text": "What are the three main arguments presented?"}
    ]
)
print(interaction.output_text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const ai = new GoogleGenAI({});

// Upload a long video
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 });
}

// Use agentic processing
const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    {
      type: "video",
      uri: videoFile.uri,
      mime_type: videoFile.mimeType,
      processing: "agentic"
    },
    { type: "text", text: "What are the three main arguments presented?" }
  ]
});
console.log(interaction.output_text);

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.8-flash",
    "input": [
      {
        "type": "video",
        "uri": "'${file_uri}'",
        "mime_type": "video/mp4",
        "processing": "agentic"
      },
      {"type": "text", "text": "What are the three main arguments presented?"}
    ]
  }' 2> /dev/null

Примечание: Чтобы убедиться в использовании агентной обработки, проверьте interaction.steps . Наличие строк processing_call и processing_result указывает на то, что модель динамически перемещалась по видео.

Этапы реагирования

В массив steps агентной обработки добавлены два новых типа шагов:

  • processing_call : модель запросила видеофрагмент или аудиозапись, идентифицированную по id .
  • processing_result : результат этой загрузки, связанный с call_id .

Эти шаги отображаются вперемешку с этапами thought (если включены сводки) и предшествуют заключительному шагу model_output . Их можно использовать для отображения трассировки прогресса в пользовательском интерфейсе, но они не требуют ответа.

В следующем примере показан ответ с чередующимися этапами обработки:

{
  "steps": [
    {
      "type": "thought",
      "signature": "sig_thought_1",
      "summary": [
        {
          "type": "text",
          "text": "Inspecting transcript for key discussion topics..."
        }
      ]
    },
    {
      "type": "processing_call",
      "id": "call_01",
      "signature": "sig_call_01"
    },
    {
      "type": "processing_result",
      "call_id": "call_01",
      "signature": "sig_result_01"
    },
    {
      "type": "thought",
      "signature": "sig_thought_2",
      "summary": [
        {
          "type": "text",
          "text": "Loading visual frames to verify slide content..."
        }
      ]
    },
    {
      "type": "processing_call",
      "id": "call_02",
      "signature": "sig_call_02"
    },
    {
      "type": "processing_result",
      "call_id": "call_02",
      "signature": "sig_result_02"
    },
    {
      "type": "thought",
      "signature": "sig_thought_3",
      "summary": [
        {
          "type": "text",
          "text": "Synthesizing answer from gathered evidence..."
        }
      ]
    },
    {
      "type": "model_output",
      "content": [
        {
          "type": "text",
          "text": "The three main arguments presented in the lecture are..."
        }
      ]
    }
  ]
}

Используйте разные режимы обработки для разных видео.

В одном запросе можно задать разные режимы обработки для каждого видео:

Python

from google import genai

client = genai.Client()

lecture = client.files.upload(file="path/to/long-lecture.mp4")
experiment = client.files.upload(file="path/to/short-experiment.mp4")

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "video",
            "uri": lecture.uri,
            "mime_type": lecture.mime_type,
            "processing": "agentic"  # Use agentic video understanding
        },
        {
            "type": "video",
            "uri": experiment.uri,
            "mime_type": experiment.mime_type,
            "processing": "static"  # Use static processing
        },
        {"type": "text", "text": "Compare the lecture content with the experiment results."}
    ]
)
print(interaction.output_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 interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    {
      type: "video",
      uri: lecture.uri,
      mime_type: lecture.mimeType,
      processing: "agentic" // Use agentic video understanding
    },
    {
      type: "video",
      uri: experiment.uri,
      mime_type: experiment.mimeType,
      processing: "static" // Use static processing
    },
    { type: "text", text: "Compare the lecture content with the experiment results." }
  ]
});
console.log(interaction.output_text);

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.8-flash",
    "input": [
      {
        "type": "video",
        "uri": "'${lecture_uri}'",
        "mime_type": "video/mp4",
        "processing": "agentic"
      },
      {
        "type": "video",
        "uri": "'${experiment_uri}'",
        "mime_type": "video/mp4",
        "processing": "static"
      },
      {"type": "text", "text": "Compare the lecture content with the experiment results."}
    ]
  }' 2> /dev/null

Многоэтапные видеоразговоры

Контекст видео сохраняется между репликами в разговоре. При использовании агентной обработки:

  • Режим с сохранением состояния (с использованием previous_interaction_id ): сервер сохраняет контекст видео. Дополнительная обработка не требуется.
  • Режим без сохранения состояния (с использованием step_list ): В режиме без сохранения состояния ответ включает шаги processing_call и processing_result , которые кодируют контекст видео. Для сохранения контекста видео необходимо включить все шаги из ответа в step_list вашего следующего запроса. Хотя их пропуск в настоящее время не приводит к ошибке API, контекст видео теряется, что значительно снижает качество ответов на последующие вопросы. Обратите внимание, что шаги, отправленные в последующих запросах, учитываются в подсчете входных токенов.

Обратитесь к временным меткам в содержимом.

Вы можете задавать вопросы о конкретных моментах видео, используя временные метки в формате MM:SS .

Python

prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?"

JavaScript

const prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?";

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.VideoContent;
import com.google.genai.gaos.models.interactions.VideoContentMimeType;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.List;

Client client = new Client();

Content textContent = TextContent.builder().text("Summarize the key events in this video.").build();
Content videoContent =
    VideoContent.builder()
        .uri("gs://cloud-samples-data/generative-ai/video/pixel8.mp4")
        .mimeType(VideoContentMimeType.VIDEO_MP4)
        .build();

List<Content> contents = Arrays.asList(textContent, videoContent);

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.ofContent(contents))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

ОТДЫХ

PROMPT="What are the examples given at 00:05 and 00:10 supposed to show us?"

Извлеките подробную информацию из видео.

Модели Gemini обладают мощными возможностями для понимания видеоконтента, обрабатывая информацию как из аудио-, так и из видеопотоков . Это позволяет извлекать богатый набор деталей, включая создание описаний происходящего в видео и ответы на вопросы о его содержании.

Для визуального описания модель обрабатывает видео с частотой 1 кадр в секунду (FPS). Эта частота дискретизации по умолчанию хорошо подходит для большинства материалов, но следует отметить, что она может упускать детали в видео с быстрым движением или быстрой сменой сцен.

Python

prompt = "Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments."

JavaScript

const prompt = "Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments.";

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.Content;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.interactions.TextContent;
import com.google.genai.gaos.models.interactions.VideoContent;
import com.google.genai.gaos.models.interactions.VideoContentMimeType;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.List;

Client client = new Client();

Content textContent = TextContent.builder().text("Summarize the key events in this video.").build();
Content videoContent =
    VideoContent.builder()
        .uri("gs://cloud-samples-data/generative-ai/video/pixel8.mp4")
        .mimeType(VideoContentMimeType.VIDEO_MP4)
        .build();

List<Content> contents = Arrays.asList(textContent, videoContent);

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.ofContent(contents))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

ОТДЫХ

PROMPT="Describe the key events in this video, providing both audio and visual details. Include timestamps for salient moments."

Настройка обработки видео

В API Gemini можно настроить обработку видео, задав интервалы обрезки или указав пользовательскую частоту дискретизации кадров. Эти параметры настройки поддерживаются только при обработке видео в "static" режиме.

Установить интервалы обрезки

Вы можете обрезать видео, указав start_offset и end_offset в объекте конфигурации processing .

Python

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "video",
            "uri": video_file.uri,
            "mime_type": video_file.mime_type,
            "processing": {
                "type": "static",
                "start_offset": 1200,
                "end_offset": 1500,
            },
        },
        {"type": "text", "text": "Summarize this section of the video."},
    ],
)
print(interaction.output_text)

JavaScript

const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    {
      type: "video",
      uri: videoFile.uri,
      mime_type: videoFile.mimeType,
      processing: {
        type: "static",
        start_offset: 1200,
        end_offset: 1500,
      },
    },
    { type: "text", text: "Summarize this section of the video." },
  ],
});
console.log(interaction.output_text);

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.8-flash",
    "input": [
      {
        "type": "video",
        "uri": "'${file_uri}'",
        "mime_type": "video/mp4",
        "processing": {
          "type": "static",
          "start_offset": 1200,
          "end_offset": 1500
        }
      },
      {"type": "text", "text": "Summarize this section of the video."}
    ]
  }' 2> /dev/null

Установите пользовательскую частоту кадров

Вы можете задать пользовательскую частоту дискретизации кадров, передав аргумент fps в объекте конфигурации processing .

Python

interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input=[
        {
            "type": "video",
            "uri": video_file.uri,
            "mime_type": video_file.mime_type,
            "processing": {
                "type": "static",
                "fps": 0.5,  # Sample 1 frame every 2 seconds
            },
        },
        {"type": "text", "text": "Describe the scene changes in this video."},
    ],
)
print(interaction.output_text)

JavaScript

const interaction = await ai.interactions.create({
  model: "gemini-3.8-flash",
  input: [
    {
      type: "video",
      uri: videoFile.uri,
      mime_type: videoFile.mimeType,
      processing: {
        type: "static",
        fps: 0.5, // Sample 1 frame every 2 seconds
      },
    },
    { type: "text", text: "Describe the scene changes in this video." },
  ],
});
console.log(interaction.output_text);

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.8-flash",
    "input": [
      {
        "type": "video",
        "uri": "'${file_uri}'",
        "mime_type": "video/mp4",
        "processing": {
          "type": "static",
          "fps": 0.5
        }
      },
      {"type": "text", "text": "Describe the scene changes in this video."}
    ]
  }' 2> /dev/null

Поддерживаемые форматы видео

Gemini поддерживает следующие MIME-типы видеоформатов:

  • video/mp4
  • video/mpeg
  • video/mov
  • video/avi
  • video/x-flv
  • video/mpg
  • video/webm
  • video/wmv
  • video/3gpp

Технические подробности о видео

  • Поддерживаемые модели и контекст : Все модели Gemini могут обрабатывать видеоданные.
    • Модели с контекстным окном размером 1 Мб могут обрабатывать видео продолжительностью до 3 часов по умолчанию (при низком разрешении медиафайлов) или до 1 часа при высоком разрешении медиафайлов.
  • Режимы обработки : модели Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash, 3.5 Flash Lite и более поздние поддерживают два режима обработки видео:
    • Статический режим : Кадры извлекаются с частотой 1 кадр в секунду и помещаются в контекст (по умолчанию для всех моделей). Аудио обрабатывается со скоростью 1 кбит/с (один канал). Временные метки добавляются каждую секунду. Лучше всего подходит для коротких клипов или когда важен каждый кадр (например, покадровый анализ). Обратите внимание, что в динамичных сценах может наблюдаться потеря детализации из-за частоты дискретизации 1 кадр в секунду.
    • Agentic : Модель динамически перемещается по видео, загружая текстовую расшифровку и/или кадры и/или аудио по запросу. Это позволяет использовать до 88% меньше токенов для длинного контента, хотя навигация может немного увеличить время до получения первого токена (TTFT) для коротких клипов (<5 минут) из-за внутренних рассуждений и запросов к инструментам до начала генерации. Лучше всего подходит для длинных видеороликов для оптимизации затрат токенов и качества ответа. Поддерживается на Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash и 3.5 Flash Lite. Подробнее см. раздел «Понимание видео Agentic» .
  • Расчет токенов (статический режим) : Каждая секунда видео токенизируется следующим образом:
    • Отдельные кадры (с частотой 1 кадр в секунду):
      • Если media_resolution установлен на low, кадры токенизируются по 66 токенов на кадр.
      • В противном случае, кадры токенизируются по 258 токенов на кадр.
    • Аудио: 32 токена в секунду.
    • Также включены метаданные.
    • Итого: приблизительно 100 токенов в секунду видео при стандартном (низком) разрешении или приблизительно 300 токенов в секунду видео при высоком разрешении.
  • Расчет токенов (агентный режим) : Использование токенов зависит от сложности контента и стратегии навигации модели. Токены, генерируемые во время просмотра видео, учитываются как токены мыслей ( total_thought_tokens ), в то время как кадры, аудио и стенограмма, загружаемые по запросу, учитываются как токены использования инструментов ( total_tool_use_tokens ). Агентная обработка обычно использует до 88% меньше токенов, чем статическая обработка, для длинноформатного контента, поскольку модель загружает только стенограмму и/или кадры и/или аудио, необходимые для ответа на запрос (см. руководство по токенам ).
  • Разрешение медиафайлов : Gemini 3 предоставляет детальный контроль над обработкой мультимодальных изображений с помощью параметра media_resolution . Параметр media_resolution определяет максимальное количество токенов, выделяемых на каждое входное изображение или видеокадр. Более высокое разрешение улучшает способность модели считывать мелкий текст или идентифицировать мелкие детали, но увеличивает использование токенов и задержку. Параметры media_resolution и processing независимы: их можно установить для одного и того же видеовхода.

Более подробную информацию о расчетах токенов см. в руководстве по токенам .

  • Формат временной метки : При указании конкретных моментов видео в вашем задании используйте формат MM:SS (например, 01:15 для 1 минуты и 15 секунд).
  • Размещение подсказки : Если вы объединяете текст и одно видео, разместите текстовую подсказку после видеочасти во input массиве.
  • Тайм-ауты для длительных запросов : Для видео, требующих длительного времени обработки или сложного многоэтапного анализа, используйте потоковую передачу ( stream=True ) или фоновое выполнение ( background=True ). Синхронные запросы без потоковой передачи, которые подвергаются повторным попыткам на бэкэнде при высокой нагрузке, могут превышать окна действия соединения или токена аутентификации, что может привести к неожиданным ошибкам 401 Unauthorized или тайм-ауту. Потоковая передача поддерживает соединение активным и отображает промежуточный анализ и ход выполнения вызовов инструментов.

Что дальше?

  • Разрешение медиафайлов : Настройте разрешение видеокадров, чтобы сбалансировать качество и использование ресурсов.
  • Токены : Разберитесь, как происходит токенизация видеоконтента как в статическом, так и в агентном режимах обработки.
  • Системные инструкции : Системные инструкции позволяют управлять поведением модели в соответствии с вашими конкретными потребностями и сценариями использования.
  • API для работы с файлами : Узнайте больше о загрузке и управлении файлами для использования с Gemini.
  • Стратегии запроса файлов : API Gemini поддерживает запрос файлов с использованием текста, изображений, аудио и видеоданных, также известный как мультимодальный запрос.
  • Рекомендации по безопасности : Иногда модели генеративного ИИ выдают неожиданные результаты, например, неточные, предвзятые или оскорбительные. Постобработка и оценка человеком необходимы для минимизации риска причинения вреда от таких результатов.