[P0][后端] 爆款视频v1.3 - 参考爆款视频风格分析模块(video_analyzer+风格整合) #2051

Open
opened 2026-09-26 12:13:13 +08:00 by xiaoxia · 0 comments
Owner

功能概述

用户可上传1个参考爆款视频(≤60秒,≤100MB),系统分析其运镜语言(镜头分割/推拉摇移/转场/节奏/色调/BPM),整合为style_guide,指导后续文案+分镜生成按参考视频风格创作。

复用清单(禁止重写)

  • ✅ FFmpeg/ffprobe系统调用(系统已有ffmpeg命令,抽帧/场景检测直接subprocess调用,不引入新库)
  • ✅ 豆包VLM多模态(已有ai_service.call_vision(),传关键帧图片URL做视觉分析)
  • ✅ 豆包LLM(已有ai_service.call_llm(),风格整合Prompt直接调用)
  • ✅ UnifiedRenderService(已有Ken Burns zoom/pan、xfade转场、eq/colorchannelmixer色滤镜,style_guide参数直接组装到clips[]即可)
  • ✅ OSS直传(复用现有签名URL,视频文件上传走OSS,与图片同理)

新写代码

1. apps/worker/viral_video/video_analyzer.py(~300行)

  • analyze_video_style(reference_video_path, style_strength) → style_guide dict
  • 处理流程:
    ① FFmpeg抽关键帧(每2秒1帧+场景切换处额外抽帧,输出到临时目录)
    ② PySceneDetect镜头分割(ContentDetector,threshold=27,得到shot_boundaries: List[(start_sec, end_sec, duration_sec)])
    ③ OpenCV光流运镜检测(Farneback算法):每镜头取首尾帧,计算光流矢量,判断movement类型(push_in/pull_out/pan_left/pan_right/tilt_up/tilt_down/zoom_in/zoom_out/static)和intensity(low/medium/high)
    ④ librosa BPM分析(加载音轨,librosa.beat.beat_track得bpm值,映射pace:bpm>110 fast_cut,80-110 medium,<80 slow_cinematic)
    ⑤ 上传关键帧到OSS,调用豆包VLM分析(色调/构图/光线/视觉风格/画面细节),每批传3-5帧
    ⑥ 汇总结构化数据(shot_boundaries+camera_movements_raw+bpm_result+vlm_keyframes_desc),调用LLM用"风格整合Prompt"输出完整style_guide JSON
  • 支持style_strength三档:light/medium/strict,分别控制LLM整合时的灵活度
  • 错误降级:FFmpeg抽帧失败→VLM直接看3个均匀采样帧+给出粗略风格建议;OpenCV运镜检测失败→按BPM+VLM估算节奏;librosa失败→VLM判断节奏
  • 资源限制:视频≤60秒≤100MB,分析超时≤60秒,临时帧文件用完立即清理

2. apps/worker/viral_video/prompts.py 新增2个Prompt

  • VIDEO_STYLE_INTEGRATION_PROMPT(4.2.5节):将结构化分析数据+VLM关键帧描述整合为style_guide JSON
  • STYLE_CONSTRAINT_MODULE_PROMPT(⑦.8节):三档风格强度对应的分镜约束指令(light/medium/strict),拼入文案+分镜生成Prompt
  • 输出style_guide JSON格式严格按PRD 3.6节定义

3. viral_video_jobs表字段扩展(补Alembic migration)

  • reference_video_url VARCHAR(500)(参考视频OSS地址,可选,NULL=不使用参考视频)
  • style_strength VARCHAR(20) DEFAULT NULL(light/medium/strict)
  • style_guide JSONB DEFAULT NULL(视频风格分析结果)
  • style_template_id INTEGER DEFAULT NULL(从爆款模板库选预置风格时用,与reference_video_url二选一)

4. viral_video_config新增配置表

  • viral_video_style_templates(预置爆款风格模板库):id/name/description/style_guide JSONB/industry/category/cover_image_url/usage_count/created_at
  • 初始seed 10+套风格(food_fastcut美食快切、fashion_slowpush服装慢推、home_cozy家居温馨、beauty_closeup美妆特写、tech_sleek科技冷峻、street_energetic街头活力、lifestyle_soft生活柔光、fitness_dynamic健身动感、kids_playful亲子童趣、luxury_elegant轻奢优雅)

5. Celery编排器扩展(ViralVideoOrchestrator)

  • 步骤编号调整:①图片VLM分析 → 【新增①.5】视频风格分析(如果有reference_video_url)→ ②用户文案意图解析 → ③文案融合生成(注入style_guide约束)→ ...
  • 步骤③文案生成Prompt组装时,如果style_guide存在,拼入STYLE_CONSTRAINT_MODULE_PROMPT(按style_strength选档位)
  • 步骤④分镜生成时,style_guide约束作为硬约束传入,要求每个shot的ken_burns/transition/video_filter/duration匹配
  • 新增WS进度事件:viral_video:progress type=style_analyzed(payload含style_name/pace/shot_count/color_palette)
  • 分镜生成后审核(步骤⑤)新增"风格一致性"审核维度(PRD 4.4节第5条):light豁免,medium检查长度/运镜方向/滤镜/转场,strict额外检查精确时长

6. REST API扩展(apps/api/routes/viral_video.py)

  • POST /api/v1/viral-video/analyze-style(新接口,上传参考视频→返回style_guide预览,用户可在提交生成前先看AI分析的镜头语言摘要;接受reference_video_key+style_strength,返回job_id,WS推送style_analyzed事件)
  • GET /api/v1/viral-video/style-templates(返回预置爆款风格模板列表,支持industry筛选)
  • POST /api/v1/viral-video/generate 请求体增加可选字段:reference_video_url/style_strength/style_template_id

7. 分镜clips[]渲染参数映射

  • style_guide.camera_movements[i].movement → clips[i].ken_burns参数映射:
    push_in→zoom_in_slow/medium, pull_out→zoom_out_slow, zoom_in→zoom_in_slow, zoom_out→zoom_out_slow
    pan_left→pan_left_slow, pan_right→pan_right_slow, track_left→pan_left_slow, track_right→pan_right_slow
    tilt_up→(Ken Burns不支持上下平移,用zoom_in+轻微垂直平移替代,Phase3 Seedance支持真实tilt)
    follow/orbit→zoom_in_medium(模拟跟随感), static→static
  • style_guide.transitions → clips[i].transition:hard_cut→none(直接切), cross_dissolve→fade, zoom_whip→wipeleft, slide_left/slide_right→slideright/slideleft, fade_black→fadeblack
  • style_guide.color_filter → clips[i].video_filter:
    warm_vintage→eq=saturation=1.1:brightness=0.02, colorchannelmixer=.9:.1:0:0:.1:.85:.05:0:0:.1:.9:0
    cool_fresh→eq=saturation=0.95:brightness=0.01, colorchannelmixer=.85:.05:0:0:0:.9:.1:0:.1:0:.95:0
    high_contrast→eq=contrast=1.2:saturation=1.1
    soft_pastel→eq=saturation=0.8:brightness=0.03, gblur=sigma=0.3
    dramatic_cinematic→eq=contrast=1.15:saturation=0.85:gamma=0.95, vignette=PI/5
  • style_guide.bpm → BGM选择时优先选BPM±5以内的音乐,BGM切点对齐镜头切换

验收标准

  • 上传30秒美食快剪视频,style_strength=medium,style_guide输出shot_count=8-12,pace=fast_cut,camera_movements检测出快推/快拉,color_tone=warm
  • style_strength=strict模式下,10镜头参考视频输出严格10个clips,每个duration精确到±0.3秒
  • 参考视频不存在时,style_guide=None,v1.2原有流程完全不受影响(回归测试)
  • FFmpeg抽帧临时文件100%清理,不泄漏磁盘
  • 视频分析超时≤60秒,失败自动降级(不阻断整体流程)
  • style_templates预置10套风格seed完成,接口返回正确
  • 风格一致性审核:style_strength=strict下故意生成错镜头数,审核必须打回重写
  • clips[]渲染参数映射正确,UnifiedRenderService能直接消费生成视频(不需要改RenderService代码)
  • 单测覆盖:镜头分割、运镜分类、BPM分析、style_guide JSON schema校验、参数映射函数
## 功能概述 用户可上传1个参考爆款视频(≤60秒,≤100MB),系统分析其运镜语言(镜头分割/推拉摇移/转场/节奏/色调/BPM),整合为style_guide,指导后续文案+分镜生成按参考视频风格创作。 ## 复用清单(禁止重写) - ✅ FFmpeg/ffprobe系统调用(系统已有ffmpeg命令,抽帧/场景检测直接subprocess调用,不引入新库) - ✅ 豆包VLM多模态(已有ai_service.call_vision(),传关键帧图片URL做视觉分析) - ✅ 豆包LLM(已有ai_service.call_llm(),风格整合Prompt直接调用) - ✅ UnifiedRenderService(已有Ken Burns zoom/pan、xfade转场、eq/colorchannelmixer色滤镜,style_guide参数直接组装到clips[]即可) - ✅ OSS直传(复用现有签名URL,视频文件上传走OSS,与图片同理) ## 新写代码 ### 1. apps/worker/viral_video/video_analyzer.py(~300行) - analyze_video_style(reference_video_path, style_strength) → style_guide dict - 处理流程: ① FFmpeg抽关键帧(每2秒1帧+场景切换处额外抽帧,输出到临时目录) ② PySceneDetect镜头分割(ContentDetector,threshold=27,得到shot_boundaries: List[(start_sec, end_sec, duration_sec)]) ③ OpenCV光流运镜检测(Farneback算法):每镜头取首尾帧,计算光流矢量,判断movement类型(push_in/pull_out/pan_left/pan_right/tilt_up/tilt_down/zoom_in/zoom_out/static)和intensity(low/medium/high) ④ librosa BPM分析(加载音轨,librosa.beat.beat_track得bpm值,映射pace:bpm>110 fast_cut,80-110 medium,<80 slow_cinematic) ⑤ 上传关键帧到OSS,调用豆包VLM分析(色调/构图/光线/视觉风格/画面细节),每批传3-5帧 ⑥ 汇总结构化数据(shot_boundaries+camera_movements_raw+bpm_result+vlm_keyframes_desc),调用LLM用"风格整合Prompt"输出完整style_guide JSON - 支持style_strength三档:light/medium/strict,分别控制LLM整合时的灵活度 - 错误降级:FFmpeg抽帧失败→VLM直接看3个均匀采样帧+给出粗略风格建议;OpenCV运镜检测失败→按BPM+VLM估算节奏;librosa失败→VLM判断节奏 - 资源限制:视频≤60秒≤100MB,分析超时≤60秒,临时帧文件用完立即清理 ### 2. apps/worker/viral_video/prompts.py 新增2个Prompt - VIDEO_STYLE_INTEGRATION_PROMPT(4.2.5节):将结构化分析数据+VLM关键帧描述整合为style_guide JSON - STYLE_CONSTRAINT_MODULE_PROMPT(⑦.8节):三档风格强度对应的分镜约束指令(light/medium/strict),拼入文案+分镜生成Prompt - 输出style_guide JSON格式严格按PRD 3.6节定义 ### 3. viral_video_jobs表字段扩展(补Alembic migration) - reference_video_url VARCHAR(500)(参考视频OSS地址,可选,NULL=不使用参考视频) - style_strength VARCHAR(20) DEFAULT NULL(light/medium/strict) - style_guide JSONB DEFAULT NULL(视频风格分析结果) - style_template_id INTEGER DEFAULT NULL(从爆款模板库选预置风格时用,与reference_video_url二选一) ### 4. viral_video_config新增配置表 - viral_video_style_templates(预置爆款风格模板库):id/name/description/style_guide JSONB/industry/category/cover_image_url/usage_count/created_at - 初始seed 10+套风格(food_fastcut美食快切、fashion_slowpush服装慢推、home_cozy家居温馨、beauty_closeup美妆特写、tech_sleek科技冷峻、street_energetic街头活力、lifestyle_soft生活柔光、fitness_dynamic健身动感、kids_playful亲子童趣、luxury_elegant轻奢优雅) ### 5. Celery编排器扩展(ViralVideoOrchestrator) - 步骤编号调整:①图片VLM分析 → 【新增①.5】视频风格分析(如果有reference_video_url)→ ②用户文案意图解析 → ③文案融合生成(注入style_guide约束)→ ... - 步骤③文案生成Prompt组装时,如果style_guide存在,拼入STYLE_CONSTRAINT_MODULE_PROMPT(按style_strength选档位) - 步骤④分镜生成时,style_guide约束作为硬约束传入,要求每个shot的ken_burns/transition/video_filter/duration匹配 - 新增WS进度事件:viral_video:progress type=style_analyzed(payload含style_name/pace/shot_count/color_palette) - 分镜生成后审核(步骤⑤)新增"风格一致性"审核维度(PRD 4.4节第5条):light豁免,medium检查长度/运镜方向/滤镜/转场,strict额外检查精确时长 ### 6. REST API扩展(apps/api/routes/viral_video.py) - POST /api/v1/viral-video/analyze-style(新接口,上传参考视频→返回style_guide预览,用户可在提交生成前先看AI分析的镜头语言摘要;接受reference_video_key+style_strength,返回job_id,WS推送style_analyzed事件) - GET /api/v1/viral-video/style-templates(返回预置爆款风格模板列表,支持industry筛选) - POST /api/v1/viral-video/generate 请求体增加可选字段:reference_video_url/style_strength/style_template_id ### 7. 分镜clips[]渲染参数映射 - style_guide.camera_movements[i].movement → clips[i].ken_burns参数映射: push_in→zoom_in_slow/medium, pull_out→zoom_out_slow, zoom_in→zoom_in_slow, zoom_out→zoom_out_slow pan_left→pan_left_slow, pan_right→pan_right_slow, track_left→pan_left_slow, track_right→pan_right_slow tilt_up→(Ken Burns不支持上下平移,用zoom_in+轻微垂直平移替代,Phase3 Seedance支持真实tilt) follow/orbit→zoom_in_medium(模拟跟随感), static→static - style_guide.transitions → clips[i].transition:hard_cut→none(直接切), cross_dissolve→fade, zoom_whip→wipeleft, slide_left/slide_right→slideright/slideleft, fade_black→fadeblack - style_guide.color_filter → clips[i].video_filter: warm_vintage→eq=saturation=1.1:brightness=0.02, colorchannelmixer=.9:.1:0:0:.1:.85:.05:0:0:.1:.9:0 cool_fresh→eq=saturation=0.95:brightness=0.01, colorchannelmixer=.85:.05:0:0:0:.9:.1:0:.1:0:.95:0 high_contrast→eq=contrast=1.2:saturation=1.1 soft_pastel→eq=saturation=0.8:brightness=0.03, gblur=sigma=0.3 dramatic_cinematic→eq=contrast=1.15:saturation=0.85:gamma=0.95, vignette=PI/5 - style_guide.bpm → BGM选择时优先选BPM±5以内的音乐,BGM切点对齐镜头切换 ## 验收标准 - [ ] 上传30秒美食快剪视频,style_strength=medium,style_guide输出shot_count=8-12,pace=fast_cut,camera_movements检测出快推/快拉,color_tone=warm - [ ] style_strength=strict模式下,10镜头参考视频输出严格10个clips,每个duration精确到±0.3秒 - [ ] 参考视频不存在时,style_guide=None,v1.2原有流程完全不受影响(回归测试) - [ ] FFmpeg抽帧临时文件100%清理,不泄漏磁盘 - [ ] 视频分析超时≤60秒,失败自动降级(不阻断整体流程) - [ ] style_templates预置10套风格seed完成,接口返回正确 - [ ] 风格一致性审核:style_strength=strict下故意生成错镜头数,审核必须打回重写 - [ ] clips[]渲染参数映射正确,UnifiedRenderService能直接消费生成视频(不需要改RenderService代码) - [ ] 单测覆盖:镜头分割、运镜分类、BPM分析、style_guide JSON schema校验、参数映射函数
xiaoxia added the backendP0feature labels 2026-09-26 12:13:13 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#2051