关于Gemini 1.5 Pro/Flash处理MP4视频并提取场景截图的技术咨询
Gemini 1.5 Pro/Flash处理MP4视频并提取场景截图的技术咨询
你好!针对你用Gemini 1.5 Pro/Flash处理MP4视频提取场景截图的问题,我整理了目前可行的方案和细节:
核心结论:无法直接返回截图
Gemini 1.5系列(包括Pro和Flash)目前不支持直接返回视频场景的图片文件。它的视频交互能力聚焦于基于视频内容生成文本输出——比如分析画面、描述场景、识别时间戳,没办法直接输出图片格式的帧数据。
可行替代方案:时间戳 + 第三方工具截取
你想到的思路是完全可行的:先让模型识别视频中的关键场景,返回对应的时间戳(分/秒),再用Python的第三方库(比如OpenCV、FFmpeg)根据时间戳截取视频帧。
调整后的Vertex AI调用代码(获取关键场景时间戳)
针对你用Python调用的场景,我修改了官方示例,让模型返回结构化的关键场景时间戳列表:
import vertexai from vertexai.generative_models import GenerativeModel, Part # TODO(developer): Update and un-comment below line # PROJECT_ID = "your-project-id" vertexai.init(project=PROJECT_ID, location="us-central1") model = GenerativeModel("gemini-1.5-flash-002") video_file_uri = ( "gs://cloud-samples-data/generative-ai/video/behind_the_scenes_pixel.mp4" ) # 明确prompt指令,让模型输出标准化的时间戳+场景描述 prompt = """ 仔细遍历视频的每一个关键画面,识别出所有内容发生明显变化的关键场景,按以下格式输出: - [时间戳(mm:ss)]: 场景简要描述 严格基于视频内容输出,不要添加任何视频中没有的信息。 """ contents = [ Part.from_uri(video_file_uri, mime_type="video/mp4"), prompt, ] response = model.generate_content(contents) print(response.text)
用OpenCV根据时间戳截取帧
拿到模型返回的时间戳后,你可以用OpenCV快速截取对应帧并保存为图片,示例代码如下:
import cv2 def save_scene_screenshot(video_local_path, timestamp, save_filename=None): # 解析时间戳为毫秒(比如"00:48"转为48000毫秒) mins, secs = map(int, timestamp.split(":")) target_ms = (mins * 60 + secs) * 1000 # 打开视频文件 video_cap = cv2.VideoCapture(video_local_path) # 设置读取位置到目标时间戳 video_cap.set(cv2.CAP_PROP_POS_MSEC, target_ms) # 读取帧 success, frame = video_cap.read() if success: # 自动生成保存文件名(如果没指定) if not save_filename: save_filename = f"scene_{timestamp.replace(':', '_')}.png" cv2.imwrite(save_filename, frame) print(f"已保存场景截图:{save_filename}") else: print(f"无法读取时间戳{timestamp}对应的帧") video_cap.release() # 示例调用:假设从Gemini获取的时间戳是"00:48" save_scene_screenshot("your_video.mp4", "00:48")
关于官方示例的补充
你参考的Vertex AI官方示例(包括你贴出的代码)都只返回文本,这是因为Gemini模型的设计定位是多模态输入-文本输出,暂时没有开放直接返回图片的能力,所以你找不到返回截图的相关接口。
备注:内容来源于stack exchange,提问作者Yuval Maliniak




