Video_REST.ipynb:使用REST API处理视频的完整指南
技术背景
随着多模态AI的发展,处理视频内容成为重要需求。Gemini API提供了强大的视频理解能力,但视频文件通常较大,直接通过常规API请求传输效率低且易失败。File API应运而生,它支持可恢复上传、异步处理,并允许在提示中引用已上传的媒体文件。本教程解决的核心问题是:如何高效、可靠地将视频文件上传至Gemini API并用于内容生成。适用场景包括视频内容分析、摘要生成、物体识别等。主要限制包括文件大小(<2GB)、存储配额(每项目20GB)、文件保留期(2天)以及API密钥的安全风险。
核心原理
核心原理是使用File API进行可恢复上传。流程分为三步:1) 发起上传任务,通过HTTP头(X-Goog-Upload-Protocol: resumable)告知API开始可恢复上传,并携带元数据(文件名、MIME类型、字节数),API返回上传URL(x-goog-upload-url)。2) 将视频字节通过PUT请求发送到该URL,使用X-Goog-Upload-Offset指定偏移量,支持断点续传。3) 上传完成后,文件进入PROCESSING状态,需轮询files.get端点直到状态变为ACTIVE。之后在generateContent请求中通过file_data部分引用文件URI,模型即可处理视频。关键设计决策包括:使用API密钥进行身份验证,但需注意密钥权限范围;文件与云项目关联,无法跨项目访问;文件保留2天,需及时使用。
架构分析
系统架构涉及三个主要组件:客户端(curl脚本)、Gemini API的File API和生成内容端点。数据流为:客户端上传视频至File API,File API存储并处理视频,返回文件URI;客户端随后调用generateContent端点,在请求体中包含file_data引用,模型读取视频并生成响应。设计思想是分离上传与推理,避免大文件阻塞推理请求,同时支持异步处理。File API采用可恢复上传协议,提高大文件传输的可靠性。组件关系:File API负责媒体生命周期管理,生成端点负责模型推理。可修改点包括:上传策略(分块大小)、轮询间隔、模型选择等。
完整实战教程
##### 版权所有 2026 Google LLC.
#@title Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
Gemini API:使用 REST 进行视频提示
本笔记本提供了快速代码示例,展示如何使用 curl 通过视频文件调用 Gemini API。在此示例中,您将使用 Big Buck Bunny 的短片片段。
您可以在 Google Colab 中运行此笔记本,或者将 curl 命令复制/粘贴到您的终端中。
设置环境
要运行此笔记本,您的 API 密钥必须存储在名为 GEMINI_API_KEY 的 Colab 密钥中。如果您在其他环境中运行,可以将密钥存储在环境变量中。请参阅 身份验证 了解更多信息。
身份验证概述
重要提示: File API 使用 API 密钥进行身份验证和访问控制。上传的文件与 API 密钥的云项目相关联。与其他使用 API 密钥的 Gemini API 不同,您的 API 密钥还授予对您上传到 File API 的数据的访问权限,因此请格外小心地保护您的 API 密钥。有关保护 API 密钥的最佳实践,请参阅 API 控制台支持中心。
import os
from google.colab import userdata
os.environ['GEMINI_API_KEY'] = userdata.get('GEMINI_API_KEY')
安装 jq 以帮助处理 JSON API 响应。
!apt install -q jq
使用 Gemini API 处理视频文件
Gemini API 通过 File API 接受视频文件格式。File API 接受小于 2GB 的文件,每个项目最多可存储 20GB 的文件。文件保留 2 天,且无法通过 API 下载。在本示例中,您将使用短片《大雄兔》。
《大雄兔》版权所有 (C) 2008,Blender Foundation / www.bigbuckbunny.org,并根据 知识共享署名 3.0 许可协议 授权。
注意:在 Colab 中,您也可以上传自己的文件 来使用。
!wget https://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4
现在视频文件已在本地可用,生成一些将在后续步骤中使用的元数据。
%%bash
VIDEO_PATH="./BigBuckBunny_320x180.mp4"
DISPLAY_NAME="Big Buck Bunny"
# Auto-detect the metadata needed when you upload the video.
MIME_TYPE=$(file -b --mime-type "${VIDEO_PATH}")
NUM_BYTES=$(wc -c < "${VIDEO_PATH}")
echo $VIDEO_PATH $MIME_TYPE $NUM_BYTES
# Colab doesn't allow sharing shell variables between cells, so save them.
cat >./vars.sh <<-EOF
export BASE_URL="https://generativelanguage.googleapis.com"
export DISPLAY_NAME="${DISPLAY_NAME}"
export VIDEO_PATH=${VIDEO_PATH}
export MIME_TYPE=${MIME_TYPE}
export NUM_BYTES=${NUM_BYTES}
EOF
启动上传任务
File API 中的媒体上传是可恢复的,因此第一步是定义一个上传任务。这个初始请求会为你提供一个引用,可用于后续的上传操作,并允许你在发送数据之前查询上传状态,以防数据传输过程中出现网络问题。
API 会在 x-goog-upload-url 头中返回上传 URL,因此请注意响应头中的该字段——你将把负载数据发送到这个 URL。
此初始请求不发送任何负载数据(视频字节)。
%%bash
. vars.sh
# Create the "new upload" request by providing the relevant metadata.
curl "${BASE_URL}/upload/v1beta/files?key=${GEMINI_API_KEY}" \
-D upload-header.tmp \
-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
# Print the status.
head -1 upload-header.tmp
上传视频数据
现在你已经创建了上传任务,可以通过向返回的上传 URL 发送字节来上传文件数据。
%%bash
. vars.sh
# Extract the upload URL to use from the response headers.
upload_url=$(grep -i "x-goog-upload-url: " upload-header.tmp | cut -d" " -f2 | tr -d "\r")
# The header contains our API key, so don't leave it lying around.
rm upload-header.tmp
# Upload the actual bytes.
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}" >file_info.json 2>/dev/null
# Show the output. You will use it in a later step.
cat file_info.json
获取文件信息
上传文件后,您可以通过查询 files.get 端点 来验证 API 是否已成功接收文件。
files.get 允许您查看上传到 File API 且与您的 API 密钥所属的 Cloud 项目关联的文件。只有 name(以及由此扩展的 uri)是唯一的。
%%bash
. vars.sh
file_uri=$(jq -r ".file.uri" file_info.json)
curl "${file_uri}?key=${GEMINI_API_KEY}" 2>/dev/null
等待处理
文件上传后,文件服务将执行一些预处理,以便视频可供 LLM 使用。对于简单的媒体类型,这通常只需极短的时间,但对于视频内容,您可能需要稍等片刻。
您可以使用 state 字段查询视频是否已准备好使用。如果您过早地在提示中使用它,您将看到类似 The File ... is not in an ACTIVE state and usage is not allowed 的错误。
%%bash
state=$(jq -r ".file.state" file_info.json)
file_uri=$(jq -r ".file.uri" file_info.json)
while [[ "${state}" == "PROCESSING" ]];
do
echo "Processing video..."
sleep 5
# Get the file of interest to check state
curl "${file_uri}?key=${GEMINI_API_KEY}" >file_info.json 2>/dev/null
state=$(jq -r ".state" file_info.json)
done
echo "Video is now ${state}."
使用视频进行提示
视频上传并处理完成后,您可以在提示中引用它。
在组装 contents 时,可以使用 file_data 部分引用视频,如下所示:
{
"file_data": {
"mime_type": "video/mp4",
"file_uri": "https://uri/from/previous/steps"
}
}
自己试试这个请求。
MODEL_ID = "gemini-3.7-flash" # @param ["gemini-3.1-pro-preview", "gemini-3.7-flash", "gemini-3.5-flash-lite", "gemini-2.5-pro"] {"allow-input":true, isTemplate: true}
%%bash
. vars.sh
file_uri=$(jq ".uri" file_info.json)
curl "${BASE_URL}/v1beta/models/${MODEL_ID}:generateContent?key=${GEMINI_API_KEY}" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"text": "Please describe this file."},
{"file_data": {
"mime_type": "'${MIME_TYPE}'",
"file_uri": '${file_uri}'}}]
}]
}' 2>/dev/null >response.json
jq -C .candidates[].content response.json
延伸阅读
File API 允许您上传多种多模态 MIME 类型,包括图像、音频和视频格式。File API 处理可用于通过内容生成端点生成内容的输入。
* 阅读 File API 参考文档。
* 在文档中了解有关使用媒体文件进行提示的更多信息,包括支持的格式和最大长度。
常见问题
常见错误及排查:1) 上传后文件状态非ACTIVE,提示'File is not in an ACTIVE state',需等待处理完成,可增加轮询等待时间。2) 上传URL提取失败,检查响应头是否包含x-goog-upload-url,确保curl命令正确输出头信息。3) API密钥泄露风险,避免在日志中打印密钥,使用环境变量管理。4) 文件大小超限,检查文件是否超过2GB,可压缩或分段。5) MIME类型错误,使用file命令自动检测。6) 网络中断导致上传失败,利用可恢复上传的偏移量机制续传。生产环境优化:使用SDK而非curl,实现自动重试和并发控制;将文件URI缓存,避免重复上传;设置合理的轮询间隔(如5秒)减少API调用;监控API配额和成本。
企业应用扩展
进一步学习建议:1) 探索File API支持的其他媒体类型(图像、音频),了解不同格式的处理差异。2) 学习Gemini API的更多功能,如视频时间戳定位、帧提取等。3) 结合LangChain等框架构建视频分析应用。4) 研究如何将视频处理集成到生产流水线,包括异步任务队列、结果存储等。5) 关注API更新,如新模型版本对视频处理能力的增强。
总结
本教程面向有编程基础的开发者,深入讲解如何通过REST API(curl命令)调用Gemini API处理视频文件。内容涵盖环境配置、File API的可恢复上传机制、文件状态轮询、以及如何将视频作为多模态输入进行内容生成。教程不仅提供完整代码,还剖析了每个步骤的原理、设计决策和潜在问题,并给出生产环境优化建议,帮助开发者掌握AI视频处理的工程实践。
- --
内容来源与验证
- 内容等级:PREMIUM_A
- 质量等级:A
- 难度:中级
- 验证等级:V1
- 原文作者:
- 原文日期:
- 来源许可:Apache-2.0
- 来源版本:
6cb286a9850192fc9d0608851f9dbbaa8186f10f - 查看原文
站内还有更多完整实战教程
加入会员,解锁全部教程、完整代码与持续更新内容。
加入会员