星冉 · 视频分析 · Video Analyzer
> 星冉出品(主理人:Astra)— 基于 OpenCV + K-Means + 场景化投放诊断方法论的全链路视频分析 Skill。
> 不仅提取技术指标,更结合具体投放平台与目标,帮助用户看清视频的问题、亮点与改进方向。
⚠️ 核心工作流:分析前必须先询问客户
这是本 Skill 的第一原则。 每个平台对视频的要求规范不同,同一视频在不同平台的结论也不同。
因此,在启动任何分析之前,必须先向客户确认以下 6 件事,再据此组织场景化分析:
必问清单(6 问)
| # | 必问 | 选项/示例 | 作用 |
|---|---|---|---|
| 1 | 发布哪些平台? | 抖音 / 快手 / 微信视频号 / 百度(可多选) | 决定用哪套平台规则分析 |
| 2 | 投放目标是什么? | 带货转化 / 涨粉 / 留资获客 / 品牌曝光 / 自然破圈 | 决定分析维度的侧重点 |
| 3 | 行业/品类? | 医疗 / 金融 / 教育 / 食品 / 美妆 / 游戏… | 决定合规红线(行业资质、违禁词尺度) |
| 4 | 目标受众画像? | 宝妈 / 新手 / 上班族 / B端采购… | 决定受众匹配度分析 |
| 5 | 付费投放还是自然发布? | 付费投放 / 自然发布 | 决定审核尺度(付费外层素材更严) |
| 6 | 素材基本信息? | 是否原创 / 是否含品牌 Logo / 时长来源 | 决定原创度与搬运判定 |
> 若客户未明确某几项,可按合理假设补全(如默认「付费投放」「全平台」「带货转化」),
> 并在分析结论中明确标注假设,避免误导。
场景化分析原则
- 只分析客户指定的平台,不用一套通用逻辑套所有平台;
- 每个平台用它自己的审核红线、内容偏好、流量分发机制逐条核对;
- 分析侧重点随目标而变(如「带货」重点看 CTA/利益点/时长,「涨粉」重点看垂直度/关注引导);
- 每个问题带严重程度分级(致命/高危/中危/低危)与可定位时间点。
快速开始
单视频分析(场景化)
# 基础分析(本地文件)
python -m scripts.pipeline /path/to/video.mp4 --output-dir ./output
# 场景化分析(指定平台 + 目标 + 行业 + 受众)
python -m scripts.pipeline video.mp4 --report \
--platforms douyin,wechat_channels \
--goal conversion \
--industry 宠物食品 \
--audience 宝妈
# 自然发布(非付费)分析
python -m scripts.pipeline video.mp4 --report --organic --goal breakout
# URL 分析
python -m scripts.pipeline "https://v.douyin.com/xxx" --report
# 已有帧图目录分析(浏览器捕获的帧)
python -m scripts.pipeline ./frames_dir/ --mode pre-extracted --output-dir ./output
批量处理
python -m scripts.batch_processor ./videos/ --output-dir ./batch_output
python -m scripts.batch_processor ./videos/ --incremental --cache-dir ./cache
核心能力矩阵
| 能力 | 模块 | 方法 | 输出 |
|---|---|---|---|
| 元数据提取 | MetadataExtractor |
cv2.VideoCapture 属性 | 格式/分辨率/时长/fps/编码 |
| 关键帧提取 | FrameExtractor |
均匀时间采样 + 直方图场景检测 | N帧JPEG + 场景边界列表 |
| 色彩分析 | ColorAnalyzer |
K-Means聚类 + LAB/HSV空间计算 | 主色/色温/饱和度/对比度 |
| 构图分析 | CompositionAnalyzer |
Sobel边缘 + 视觉重心 + 三分法 | 构图类型/平衡分/留白率/层次数 |
| 运动/节奏分析 | MotionAnalyzer |
帧差法运动强度 | 运动强度序列/静态帧占比/节奏变异 |
| 场景切分 | SceneDetector |
HSV直方图相关系数差异 | 场景列表(起止时间/关键帧) |
| 文字识别 | OCRExtractor |
PaddleOCR → pytesseract 兜底 | 逐帧文字/全文字幕聚合 |
| 音频真实分析 | AudioAnalyzer |
ffmpeg抽取 + numpy特征 | 音量/峰值/动态范围/静音段/BGM/能量时间线 |
| 逐帧分析 | FrameAnalyzer |
逐帧指标 + 违规扫描 + 音画同步 | 画面/字幕/违规时间线/完播风险点 |
| 标题封面分析 | TitleCoverAnalyzer |
首帧OCR + 色彩构图 | 标题文字/CTA检测/封面质量 |
| 8维度诊断 | DimensionEvaluator |
规则引擎综合评估 | 每维度的问题/亮点/改进 + 评分 |
| 场景化投放诊断 | AdDiagnosticsEvaluator |
平台规则引擎 + 场景配置 | 每平台独立问题清单 + 对比总览 |
| 报告生成 | ReportGenerator |
Jinja2模板渲染 | HTML可视化诊断报告 |
八维度诊断体系
对每个视频,从 8 个维度逐一诊断,每个维度输出 评分(0-100)、等级、问题、亮点、改进建议:
| # | 维度 | 关注指标 | 诊断要点 |
|---|---|---|---|
| 1 | 🎨 画面质量 | 亮度/对比度/饱和度/清晰度 | 模糊、曝光、发灰、色彩平淡 |
| 2 | 🔊 声音质量 | 音量/峰值/动态范围/静音 | 爆音、音量过小、忽大忽小 |
| 3 | 🧱 内容结构 | 场景数/开场/结尾/CTA | 结构单一、缺钩子、缺转化 |
| 4 | 🎵 节奏 | 运动强度/镜头时长/静态占比 | 拖沓、过快、单调 |
| 5 | ✂️ 剪辑 | 切点密度/跳切/时长分布 | 跳切过多、剪辑碎、不连贯 |
| 6 | 💬 字幕 | OCR覆盖率/文字量 | 字幕缺失、信息过载 |
| 7 | 🎼 配乐 | BGM存在性/低频能量 | 缺配乐、氛围单薄 |
| 8 | 🖼️ 标题与封面 | 标题文字/CTA/封面色彩 | 无标题、无钩子、封面平淡 |
逐帧分析维度(带时间点定位)
在 8 维度与场景化投放诊断之外,逐帧分析输出带时间点的结论,整合进问题清单与修改建议:
| 逐帧维度 | 关注指标 | 输出 |
|---|---|---|
| 🎨 画面 | 逐帧亮度/模糊度 | 定位模糊帧、暗帧、过曝帧(附时间点) |
| 💬 字幕 | 逐帧 OCR 覆盖 | 字幕断层、信息空窗段 |
| 🎬 音画同步 | 字幕时间线 vs 音频能量时间线 | 疑似字幕错位、有声无字幕(启发式) |
| ⚠️ 违规风险点 | 逐帧 OCR 扫描违规词 | 违规词时间线(定位到具体秒) |
| ⏱ 节奏与完播率 | 逐帧运动强度 | 开场钩子缺失、节奏低谷、结尾无 CTA |
> 音画同步为启发式检测(字幕帧 vs 音频能量),精确口型对齐需 ASR。
场景化投放诊断体系(抖音·快手·视频号·百度)
从「通用规则引擎」升级为「按平台逐条分析」。每个平台独立输出:
适配分 + 问题清单(严重程度分级)+ 修改建议 + 内容偏好/流量机制适配说明,并附跨平台对比总览。
严重程度分级
| 级别 | 含义 | 示例 |
|---|---|---|
| 🔴 致命 | 直接拒审/封禁,必须整改 | 极限词、联系方式、医疗功效承诺、涉政 |
| 🟠 高危 | 大概率拒审或严重限流 | 诱导互动、硬广痕迹、收益承诺、搬运 |
| 🟡 中危 | 影响投放效果 | 缺钩子、无字幕、音画不同步、时长不适配 |
| 🔵 低危 | 锦上添花的优化项 | 色彩平淡、标题偏长、缺 BGM |
四平台审核与推荐要点
| 平台 | 审核重点 | 推荐机制关键 |
|---|---|---|
| 🎵 抖音 | 硬广痕迹、诱导互动、侵权、音画不同步、AI需标注 | 收藏率>复访率>铁粉互动>5秒完播;前3秒钩子;15-40s |
| 📺 快手 | 原生「确认审」:反说明书式硬广、多频次引导、关键词谐音 | 搜索+信息流双引擎;2026 考核全店GMV+自然流量占比 |
| 💬 微信视频号 | 站外导流、绝对词零容忍、搬运/混剪、AI标注、收益焦虑 | 双引擎(社交55%+算法45%);内容价值密度>完播;前3秒跳出率<30% |
| 🔎 百度 | 语义一致性(创意=落地页首屏)、联系方式、行业资质 | 搜索靠关键词意图、信息流靠场景代入;复审7-30天 |
> 四平台完整审核红线与推荐机制见 references/ad-platform-guidelines.md,代码化规则见 scripts/platforms.py。
调用接口
CLI 调用
python -m scripts.pipeline <INPUT> [OPTIONS]
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
INPUT |
str | — | 视频文件路径、URL、或帧图目录 |
--output-dir, -o |
str | ./output |
输出根目录 |
--interval |
float | 1.0 |
采样间隔(秒) |
--max-frames |
int | 300 |
最大抽帧数 |
--colors, -k |
int | 5 |
K-Means聚类主色数 |
--mode |
str | auto |
auto/file/url/pre-extracted |
--report |
flag | False |
生成HTML诊断报告 |
--scene-threshold |
float | 0.3 |
场景切换敏感度(0-1) |
--no-ocr |
flag | False |
跳过OCR(加速) |
--platforms |
str | 全平台 | 目标平台,逗号分隔:douyin,kuaishou,wechat_channels,baidu |
--goal |
str | conversion |
目标:conversion/growth/lead/brand/breakout |
--industry |
str | — | 行业/品类(医疗/金融/教育/食品…) |
--audience |
str | — | 目标受众画像 |
--organic |
flag | False |
自然发布(默认付费投放) |
--not-original |
flag | False |
标记为非原创/搬运素材 |
--has-logo |
flag | False |
视频含品牌 Logo |
--verbose, -v |
flag | False |
详细日志 |
Python API
from scripts.pipeline import VideoAnalysisPipeline, AnalysisConfig
from scripts.ad_diagnostics import AnalysisScenario
config = AnalysisConfig(sample_interval_sec=2.0, max_frames=30, enable_ocr=True, enable_report=True)
# 构造投放场景(分析前先向客户确认)
scenario = AnalysisScenario(
platforms=["douyin", "wechat_channels"], # 发布平台
goal="conversion", # 带货转化
industry="宠物食品", # 行业
audience="宝妈", # 受众
is_paid=True, # 付费投放
is_original=True, # 原创
has_logo=True, # 含品牌Logo
)
pipeline = VideoAnalysisPipeline(config)
result = pipeline.analyze("/path/to/video.mp4", output_dir="./output", scenario=scenario)
# 8 维度诊断
print(result.summary["overall_score"], result.summary["overall_grade"])
for d in result.dimension_reports:
print(d["name"], d["score"], d["grade"], d["problems"])
# 场景化投放诊断(每平台独立报告)
ad = result.ad_diagnostics
print("场景:", ad["scenario"])
for p in ad["platform_reports"]: # 指定平台逐条分析
print(f"{p['icon']} {p['platform']}: {p['fit_score']} ({p['fit_grade']}) {p['verdict']}")
for i in p["issues"]: # 问题清单(严重程度分级)
print(f" [{i['severity_label']}] {i['title']} @{i['timestamp']}")
print(f" 建议: {i['suggestion']}")
for c in ad["platform_comparison"]: # 跨平台对比
print(c["platform"], c["fit_score"], c["tag"], c["top_issue"])
# 逐帧分析
fa = result.frame_analysis
for v in fa["violation_timeline"]: # 违规风险点时间线
print(f"违规: {v['time']} 「{v['keyword']}」({v['severity_label']})")
输出数据结构
output/
├── data.json # 完整结构化数据(含维度诊断 + 场景化投放诊断 + 逐帧分析)
├── frames/ # 关键帧图像
├── report.html # 可视化诊断报告(--report时)
└── cache.json # 分析缓存
data.json 顶层结构:
{
"schema_version": "2.4.0",
"metadata": {...}, # 视频元数据
"frames": [...], # 逐帧分析(含运动强度)
"scenes": [...], # 场景列表
"global_colors": {...}, # 全局色彩
"global_composition": {...}, # 全局构图
"audio": {...}, # 音频分析(含能量时间线)
"motion": {...}, # 运动/节奏分析
"title_cover": {...}, # 标题封面分析
"ocr_all_text": "...", # OCR 全文
"dimension_reports": [...], # ★ 8维度诊断报告
"summary": {...}, # ★ 综合评分总览
"frame_analysis": {...}, # ★ 逐帧分析(画面/字幕/音画同步/违规时间线/完播风险)
"ad_diagnostics": {...}, # ★ 场景化投放诊断(每平台独立报告+对比总览)
"pipeline_status": {...} # 各步骤执行状态
}
完整 Schema 见 references/output-schema.md。
依赖
pip install -r requirements.txt
必需: opencv-python-headless, numpy, Pillow
推荐: jinja2(HTML报告)
可选: yt-dlp(URL下载), paddleocr(中文OCR), pytesseract(OCR兜底)
系统: ffmpeg(音频分析,需加入 PATH)
可扩展性
- 新增平台:在
scripts/platforms.py的PLATFORMS中新增PlatformProfile(规则 + 偏好 + 流量机制),并在PLATFORM_ORDER注册。 - 新增投放目标:在
platforms.py的GOALS中新增目标定义,在ad_diagnostics.py的_check_goal中补充目标导向检查。 - 新增行业红线:在
platforms.py的INDUSTRY_RULES中新增行业合规规则。 - 新增分析维度:在
analyzers.py新建分析器,在dimensions.py注册新维度评估器。 - 新增逐帧检测:在
frame_analysis.py的FrameAnalyzer中扩展检测方法。
版权声明
© 星冉 Astra(艺名)出品。本技能全部内容著作权归作者个人所有,非公司共同财产。权利人身份以 LICENSE 文件及作品登记证书为准;授权公司及团队在 WorkBuddy 内部使用。未经书面许可,禁止对外公开分发、转售、再授权或移除本声明。