Untuk mempelajari pembuatan video, lihat panduan Gemini Omni Flash.
Model Gemini dapat memproses video, sehingga memungkinkan banyak kasus penggunaan developer yang canggih yang sebelumnya memerlukan model khusus domain. Beberapa kemampuan penglihatan Gemini mencakup kemampuan untuk: mendeskripsikan, menyegmentasikan, dan mengekstrak informasi dari video, menjawab pertanyaan tentang konten video, dan merujuk ke stempel waktu tertentu dalam video.
Anda dapat memberikan video sebagai input ke Gemini dengan cara berikut:
| Metode masukan | Ukuran maks | Kasus penggunaan yang direkomendasikan |
|---|---|---|
| File API | 20 GB (berbayar) / 2 GB (gratis) | File besar (100 MB+), video panjang (10 menit+), file yang dapat digunakan kembali. |
| Pendaftaran Cloud Storage | 2 GB (per file, tanpa batas penyimpanan) | File besar (100 MB+), video panjang (10 menit+), file persisten yang dapat digunakan kembali. |
| Data Sebaris | < 100MB | File kecil (<100 MB), durasi singkat (<1 menit), input satu kali. |
| URL YouTube | T/A | Video YouTube publik. |
Catatan: File API direkomendasikan untuk sebagian besar kasus penggunaan, terutama untuk file yang berukuran lebih dari 100 MB atau saat Anda ingin menggunakan kembali file di beberapa permintaan.
Untuk mempelajari metode input file lainnya, seperti menggunakan URL eksternal atau file yang disimpan di Google Cloud, lihat panduan Metode input file.
Mengupload file video
Kode berikut mendownload video sampel, menguploadnya menggunakan Files API, menunggu hingga diproses, lalu menggunakan referensi file yang diupload untuk meringkas video.
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
Untuk mengoptimalkan efisiensi dan performa token, pertimbangkan untuk menggunakan Pemrosesan video berbasis agen.
Selalu gunakan Files API jika total ukuran permintaan (termasuk file, perintah teks, petunjuk sistem, dll.) lebih besar dari 20 MB, durasi video signifikan, atau jika Anda ingin menggunakan video yang sama dalam beberapa perintah. File API menerima format file video secara langsung.
Untuk mempelajari lebih lanjut cara menggunakan file media, lihat Files API.
Meneruskan data video secara inline
Daripada mengupload file video menggunakan File API, Anda dapat meneruskan video
yang lebih kecil secara langsung dalam permintaan ke generateContent. Opsi ini cocok untuk
video yang lebih pendek dengan total ukuran permintaan di bawah 20 MB.
Berikut contoh cara memberikan data video inline:
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
URL YouTube yang valid
Anda dapat meneruskan URL YouTube langsung ke Gemini API sebagai bagian dari permintaan Anda sebagai berikut:
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
Batasan:
- Untuk paket gratis, Anda tidak dapat mengupload lebih dari 8 jam video YouTube per hari.
- Untuk paket berbayar, tidak ada batasan berdasarkan durasi video.
- Untuk model sebelum Gemini 2.5, Anda hanya dapat mengupload 1 video per permintaan. Untuk model Gemini 2.5 dan yang lebih baru, Anda dapat mengupload maksimal 10 video per permintaan.
- Anda hanya dapat mengupload video publik (bukan video pribadi atau tidak publik).
Pemahaman video agentik
Secara default, input video menggunakan pemrosesan statis (mengekstraksi frame pada 1 FPS). Model Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash, dan 3.5 Flash Lite juga mendukung pemahaman video berbasis agen, di mana model secara dinamis menjelajahi linimasa video, memeriksa transkrip secara selektif, dan menyesuaikan kecepatan frame serta resolusi secara adaptif dengan cepat berdasarkan perintah.
| Mode | Deskripsi | Model yang didukung |
|---|---|---|
| Statis (default) | Mengekstrak frame pada kecepatan tetap (1 FPS) dan menempatkannya ke dalam konteks dalam satu tahap. Berfungsi baik untuk klip pendek. | Semua model Gemini |
| Agentic | Model ini menavigasi linimasa video secara dinamis, hanya memuat konten yang diperlukan berdasarkan perintah. Hingga 88% lebih efisien token dan kualitas ~7% lebih tinggi pada konten panjang. | Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash, 3.5 Flash Lite |
Memilih mode pemrosesan
Sebagai panduan umum, mulailah dengan mode agen, terutama saat mengoptimalkan kualitas respons atau efisiensi token.
- Agentik: Video atau kueri berdurasi panjang yang menargetkan momen tertentu. Model secara dinamis menavigasi linimasa untuk menargetkan informasi yang relevan secara kontekstual tanpa mengisi jendela konteks.
- Statis: Kueri yang sensitif terhadap latensi pada klip pendek (di bawah 5 menit), atau kasus yang memerlukan presisi tingkat frame di seluruh klip.
Catatan: Untuk video panjang atau perintah kompleks yang memerlukan waktu pemrosesan agen lebih lama, gunakan streaming (
client.models.generate_content_stream). Hal ini akan menjaga koneksi tetap aktif, menampilkan langkah-langkah penalaran sementara, dan menghindari waktu tunggu koneksi atau autentikasi habis.
Menetapkan mode pemrosesan
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?"}
]
}]
}'
Catatan: Untuk memverifikasi bahwa pemrosesan berbasis agen digunakan, periksa
response.candidates[0].content.parts. Keberadaan bagiantool_calldantool_responsedengan jenis alatMEDIA_PROCESSINGmenunjukkan bahwa model menavigasi video secara dinamis.
Catatan: Tidak seperti alat sisi server lainnya (seperti Google Penelusuran atau konteks URL), video agentik tidak memerlukan setelan
include_server_side_tool_invocations=TruediToolConfigagar panggilan alat dan hasilnya dapat ditampilkan atau di-streaming. Bagiantool_calldantool_responseuntuk navigasi video akan ditampilkan secara otomatis saatmedia_processing="AGENTIC"disetel di bagian input mana pun.
Struktur respons
Jika pemrosesan dengan agen diaktifkan, respons akan menyertakan bagian tambahan yang mengekspos rekaman aktivitas navigasi internal:
tool_callparts (tool_type: "MEDIA_PROCESSING"): dipancarkan setiap kali model meminta segmen video atau transkrip audio.tool_responsebagian (tool_type: "MEDIA_PROCESSING"): hasil setiap operasi pemuatan.
Anda tidak perlu menangani atau membalas bagian ini secara manual: teruskan respons lengkap sebagai histori percakapan dan bagian ini akan ditangani secara otomatis.
Jika include_thoughts=True ditetapkan di ThinkingConfig, langkah-langkah penalaran akan muncul sebagai bagian thought: true yang diselingi dengan pasangan panggilan/respons alat. Jika pikiran dinonaktifkan, teks pikiran akan dihilangkan, tetapi bagian alat masih ada.
Contoh berikut menunjukkan payload respons dengan bagian panggilan alat dan respons yang disisipkan:
{
"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"
}
]
}
}
]
}
Mencampur mode pemrosesan di seluruh video
Anda dapat menetapkan mode pemrosesan yang berbeda untuk setiap Bagian video dalam permintaan yang sama:
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."}
]
}]
}'
Menggunakan context caching untuk video panjang
Untuk video yang berdurasi lebih dari 10 menit, atau saat Anda berencana membuat beberapa permintaan terhadap file video yang sama, gunakan penyimpanan cache konteks untuk mengurangi biaya dan meningkatkan latensi. Context caching memungkinkan Anda memproses video sekali dan menggunakan kembali token untuk kueri berikutnya, sehingga ideal untuk sesi chat atau analisis berulang konten panjang.
Lihat stempel waktu dalam konten
Anda dapat mengajukan pertanyaan tentang titik waktu tertentu dalam video menggunakan stempel waktu dalam bentuk 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
Mengekstrak insight mendetail dari video
Model Gemini menawarkan kemampuan canggih untuk memahami konten video dengan memproses informasi dari aliran audio dan visual. Dengan demikian, Anda dapat mengekstrak serangkaian detail yang kaya, termasuk membuat deskripsi tentang apa yang terjadi dalam video dan menjawab pertanyaan tentang kontennya.
Untuk deskripsi visual, model mengambil sampel video dengan kecepatan 1 frame per detik (FPS). Frekuensi sampling default ini berfungsi dengan baik untuk sebagian besar konten, tetapi perhatikan bahwa frekuensi ini mungkin tidak menangkap detail dalam video dengan gerakan cepat atau perubahan adegan yang cepat. Untuk konten dengan gerakan tinggi seperti itu, pertimbangkan untuk menetapkan kecepatan frame kustom.
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
Menyesuaikan pemrosesan video
Anda dapat menyesuaikan pemrosesan video di Gemini API dengan menetapkan interval kliping atau memberikan pengambilan sampel kecepatan frame kustom. Opsi penyesuaian ini hanya didukung saat memproses video dalam mode "static".
Menetapkan interval kliping
Anda dapat menggunting video dengan menentukan videoMetadata dengan selisih awal dan akhir.
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();
Menetapkan kecepatan frame kustom
Anda dapat menyetel pengambilan sampel kecepatan frame kustom dengan meneruskan argumen fps ke
videoMetadata.
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);
Secara default, 1 frame per detik (FPS) diambil sampelnya dari video. Anda dapat menyetel FPS rendah (< 1) untuk video panjang. Hal ini sangat berguna untuk video yang sebagian besar statis (misalnya, kuliah). Gunakan FPS yang lebih tinggi untuk video yang memerlukan analisis temporal yang terperinci, seperti pemahaman tindakan cepat atau pelacakan gerakan berkecepatan tinggi.
Format video yang didukung
Gemini mendukung jenis MIME format video berikut:
video/mp4video/mpegvideo/quicktimevideo/avivideo/x-flvvideo/mpgvideo/webmvideo/wmvvideo/3gpp
Detail teknis tentang video
- Model dan konteks yang didukung: Semua model Gemini dapat memproses data video.
- Model dengan jendela konteks 1 juta dapat memproses video berdurasi hingga 3 jam secara default (pada resolusi media rendah), atau hingga 1 jam pada resolusi media tinggi.
- Mode pemrosesan: Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash, 3.5 Flash Lite, dan model yang lebih baru mendukung dua mode pemrosesan video:
- Statis: Frame diekstrak pada 1 FPS dan ditempatkan ke dalam konteks (default untuk semua model). Audio diproses pada 1 Kbps (satu saluran). Stempel waktu ditambahkan setiap detik. Paling cocok untuk klip pendek atau saat setiap frame penting (seperti pemeriksaan frame demi frame). Perhatikan bahwa urutan tindakan cepat mungkin kehilangan detail karena kecepatan pengambilan sampel 1 FPS.
- Agentik: Model menavigasi video secara dinamis, memuat transkrip dan/atau frame dan/atau audio sesuai permintaan. Fitur ini menggunakan hingga 88% lebih sedikit token untuk konten panjang, meskipun navigasi dapat sedikit meningkatkan Waktu ke Token Pertama (TTFT) pada klip pendek (<5 menit) karena penalaran internal dan perjalanan pulang pergi alat sebelum pembuatan dimulai.
Respons mencakup panggilan alat dan bagian respons
MEDIA_PROCESSINGuntuk mempertahankan konteks penalaran di seluruh giliran. Paling cocok untuk video panjang guna mengoptimalkan biaya token dan kualitas respons. Didukung di Gemini 3.8 Flash, 3.7 Flash, 3.6 Flash, dan 3.5 Flash Lite. Lihat Pemahaman video berbasis agen untuk mengetahui detailnya.
- Penghitungan token (mode statis): Setiap detik video di-tokenisasi sebagai
berikut:
- Frame individual (diambil sampel pada 1 FPS):
- Jika
media_resolutiondisetel ke rendah, frame akan di-tokenisasi pada 66 token per frame. - Jika tidak, frame akan di-tokenisasi pada 258 token per frame.
- Jika
- Audio: 32 token per detik.
- Metadata juga disertakan.
- Total: Sekitar 100 token per detik video pada resolusi media default (rendah), atau sekitar 300 token per detik video pada resolusi media tinggi.
- Frame individual (diambil sampel pada 1 FPS):
- Penghitungan token (mode agen): Penggunaan token bervariasi berdasarkan kompleksitas konten dan strategi navigasi model. Token penalaran navigasi yang dihasilkan selama eksplorasi video dihitung sebagai token pemikiran (
thoughts_token_count), sedangkan frame, audio, dan transkrip yang dimuat sesuai permintaan dihitung sebagai token perintah alat (tool_use_prompt_token_count). Pemrosesan agentik biasanya menggunakan hingga 88% lebih sedikit total token dibandingkan pemrosesan statis untuk konten panjang karena model hanya memuat transkrip dan/atau frame dan/atau audio yang diperlukan untuk menjawab perintah (lihat panduan token). - Resolusi media: Gemini 3 memperkenalkan kontrol terperinci atas pemrosesan visual multimodal dengan parameter
media_resolution. Parametermedia_resolutionmenentukan jumlah maksimum token yang dialokasikan per frame video atau gambar input. Resolusi yang lebih tinggi meningkatkan kemampuan model untuk membaca teks kecil atau mengidentifikasi detail kecil, tetapi meningkatkan penggunaan token dan latensi. Parametermedia_resolutiondanmedia_processingbersifat independen: Anda dapat menyetel keduanya di Bagian video yang sama.
Untuk mengetahui detail selengkapnya tentang penghitungan token, lihat panduan token.
- Format stempel waktu: Saat merujuk ke momen tertentu dalam video di dalam perintah Anda, gunakan format
MM:SS(misalnya,01:15untuk 1 menit 15 detik). - Penempatan perintah: Jika menggabungkan teks dan satu video, tempatkan perintah teks
setelah bagian video dalam array
contents. - Waktu tunggu untuk permintaan panjang: Untuk video yang memerlukan waktu pemrosesan yang lebih lama atau penalaran multi-langkah yang kompleks, gunakan streaming (
client.models.generate_content_stream). Permintaan sinkron dan non-streaming yang mengalami percobaan ulang backend saat permintaan tinggi dapat melampaui periode validitas token autentikasi atau koneksi, yang dapat muncul sebagai error401 Unauthorizedatau waktu tunggu yang tidak terduga. Streaming menjaga koneksi tetap aktif dan menampilkan progres penalaran dan panggilan alat perantara.
Langkah berikutnya
- Resolusi media: Kontrol resolusi frame video untuk menyeimbangkan kualitas dan penggunaan token.
- Token: Pahami cara konten video di-tokenisasi dalam mode pemrosesan statis dan agentic.
- Petunjuk sistem: Petunjuk sistem memungkinkan Anda mengarahkan perilaku model berdasarkan kebutuhan dan kasus penggunaan spesifik Anda.
- Files API: Pelajari lebih lanjut cara mengupload dan mengelola file untuk digunakan dengan Gemini.
- Strategi multimodal prompting file: Gemini API mendukung multimodal prompting dengan data teks, gambar, audio, dan video, yang juga dikenal sebagai multimodal prompting.
- Panduan keamanan: Terkadang model AI generatif menghasilkan output yang tidak terduga, seperti output yang tidak akurat, bias, atau menyinggung. Pemrosesan pasca dan evaluasi manusia sangat penting untuk membatasi risiko bahaya dari output tersebut.