Skip to main content

代码

import subprocess
import time
from pathlib import Path

from agno.agent import Agent
from agno.media import Video
from agno.models.google import Gemini
from agno.utils.log import logger
from google.generativeai import get_file, upload_file

video_path = Path(__file__).parent.joinpath("sample.mp4")
output_dir = Path("tmp/shorts")

agent = Agent(
    name="Video2Shorts",
    description="处理视频并生成引人入胜的短视频。",
    model=Gemini(id="gemini-2.0-flash-exp"),
    markdown=True,
    debug_mode=True,
    instructions=[
        "直接分析提供的视频——**请勿**引用或分析任何外部来源或 YouTube 视频。",
        "识别符合短内容格式要求的吸引人片段。",
        """以**表格格式**提供您的分析,包含以下列:
   - 开始时间 | 结束时间 | 描述 | 重要性得分""",
        "确保所有时间戳都使用 MM:SS 格式,重要性得分范围为 1-10。",
        "仅关注时长在 15 到 60 秒之间的片段。",
        "分析仅基于提供的视频内容。",
        "提供可操作的见解,以改进已识别片段以优化短内容。",
    ],
)

# 上传并处理视频
video_file = upload_file(video_path)
while video_file.state.name == "PROCESSING":
    time.sleep(2)
    video_file = get_file(video_file.name)

# 多模态查询视频分析
query = """
您是视频内容创作专家,擅长为 YouTube Shorts 和 Instagram Reels 等平台制作吸引人的短视频。您的任务是分析提供的视频并识别能最大程度吸引观众的片段。

对于每个视频,您将:

1. 识别能吸引观众注意力的关键时刻,重点关注:
   - 高能序列
   - 情感爆发点
   - 令人惊讶或意想不到的时刻
   - 强大的视听元素
   - 具有引人入胜的故事的清晰叙事片段

2. 提取最适合短视频内容的片段,考虑:
   - 最佳时长(严格控制在 15-60 秒)
   - 能确保流畅过渡的自然起始和结束点
   - 能保持观众注意力的吸引人节奏
   - 视听协调以获得沉浸式体验
   - 垂直格式兼容性和必要的调整

3. 提供每个片段的详细分析,包括:
   - 精确的时间戳(开始时间 | 结束时间,MM:SS 格式)
   - 对该片段为何吸引人的清晰描述
   - 关于如何增强该片段以适应短视频内容的建议
   - 基于吸引力潜力的重要性得分(1-10)

您的目标是识别在视觉上引人注目、情感上吸引人且针对短视频平台进行了完美优化的时刻。
"""

# 生成视频分析
response = agent.run(query, videos=[Video(content=video_file)])

# 创建输出目录
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)

# 提取和剪辑视频片段
def extract_segments(response_text):
    import re

    segments_pattern = r"\|\s*(\d+:\d+)\s*\|\s*(\d+:\d+)\s*\|\s*(.*?)\s*\|\s*(\d+)\s*\|"
    segments: list[dict] = []

    for match in re.finditer(segments_pattern, str(response_text)):
        start_time = match.group(1)
        end_time = match.group(2)
        description = match.group(3)
        score = int(match.group(4))

        start_seconds = sum(x * int(t) for x, t in zip([60, 1], start_time.split(":")))
        end_seconds = sum(x * int(t) for x, t in zip([60, 1], end_time.split(":")))
        duration = end_seconds - start_seconds

        if 15 <= duration <= 60 and score > 7:
            output_path = output_dir / f"short_{len(segments) + 1}.mp4"

            command = [
                "ffmpeg",
                "-ss",
                str(start_seconds),
                "-i",
                video_path,
                "-t",
                str(duration),
                "-vf",
                "scale=1080:1920,setsar=1:1",
                "-c:v",
                "libx264",
                "-c:a",
                "aac",
                "-y",
                str(output_path),
            ]

            try:
                subprocess.run(command, check=True)
                segments.append(
                    {"path": output_path, "description": description, "score": score}
                )
            except subprocess.CalledProcessError:
                print(f"处理片段失败: {start_time} - {end_time}")

    return segments

logger.debug(f"{response.content}")

# 处理片段
shorts = extract_segments(response.content)

# 打印结果
print("\n--- 生成的短视频 ---")
for short in shorts:
    print(f"短视频位置: {short['path']}")
    print(f"描述: {short['description']}")
    print(f"吸引力得分: {short['score']}/10\n")

用法

1

创建虚拟环境

打开 Terminal 并创建一个 python 虚拟环境。
python3 -m venv .venv
source .venv/bin/activate
2

设置您的 API 密钥

export GOOGLE_API_KEY=xxx
3

安装库

pip install -U opencv-python google-generativeai sqlalchemy ffmpeg-python agno
4

安装 ffmpeg

brew install ffmpeg
5

运行代理

python cookbook/agent_concepts/multimodal/video_to_shorts.py