一、项目概述

本文深入剖析AI视频生成服务的后端架构设计。该服务基于Adapter模式,实现了对阿里云百炼、火山引擎、MiniMax、Vidu等多种视频生成平台的统一接入,支持文生视频、图生视频、首尾帧控制、视频续写、多镜头叙事等多种生成模式。

核心特性:

  • 支持5+主流视频生成平台

  • 异步任务管理与轮询机制

  • 多模态输入(文本+图片+视频)

  • 帧连贯性优化与视频续写

  • 自动配音与音频驱动


二、视频生成架构设计

2.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                      业务层 (Business Layer)                    │
│                  VideoGenerationService                         │
│              ┌────────────────────────────────┐                │
│              │ 任务调度 | 状态管理 | 结果存储  │                │
│              └────────────────────────────────┘                │
└──────────────────────────────┬──────────────────────────────────┘
                               │
                               ▼
┌─────────────────────────────────────────────────────────────────┐
│                      适配器层 (Adapter Layer)                   │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│  │  Ali    │ │ Volc    │ │ MiniMax │ │  Vidu   │ │ Kling   │  │
│  │ Video   │ │ Engine  │ │ Video   │ │ Video   │ │ Video   │  │
│  │ Adapter │ │ Adapter │ │ Adapter │ │ Adapter │ │ Adapter │  │
│  └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘  │
│       │           │           │           │           │        │
└───────┼───────────┼───────────┼───────────┼───────────┼────────┘
        │           │           │           │           │
        ▼           ▼           ▼           ▼           ▼
┌─────────────────────────────────────────────────────────────────┐
│                    第三方API (Third-party APIs)                 │
│   阿里云百炼    火山引擎      MiniMax      Vidu       Kling    │
│   wan2.7-i2v  Seedance      T2V-01      viduq3     ...      │
└─────────────────────────────────────────────────────────────────┘

2.2 视频生成适配器接口

export interface VideoProviderAdapter {
  provider: string
  
  buildGenerateRequest(config: AIConfig, record: VideoGenerationRecord): ProviderRequest
  
  parseGenerateResponse(result: any): VideoGenResponse
  
  buildPollRequest(config: AIConfig, task_id: string): ProviderRequest
  
  parsePollResponse(result: any): VideoPollResponse
  
  extractVideoUrl(result: any): string | null
}

视频生成特有挑战:

挑战

说明

解决方案

异步性

视频生成耗时较长(5-30秒)

统一任务轮询机制

帧连贯性

多帧生成需保持角色一致性

首尾帧约束 + reference_image

格式多样性

不同平台响应格式差异大

统一响应解析接口

视频续写

基于已有视频继续生成

video_url + 帧匹配参数


三、核心实现深度剖析

3.1 阿里云百炼视频适配器

阿里云百炼提供了业界领先的视频生成能力,支持多种生成模式:

3.1.1 模型版本管理
private readonly supportedModels = [
  'wan2.7-i2v',
  'wan2.7-i2v-2026-04-25',
  'wan2.7-t2v',
  'wan2.7-t2v-2026-04-25',
  'wan2.7-r2v',
  'wan2.6-i2v-flash',
  'wan2.5-i2v',
]

模型分类:

  • i2v:图生视频(Image-to-Video)

  • t2v:文生视频(Text-to-Video)

  • r2v:参考生视频(Reference-to-Video)

3.1.2 请求构建策略
buildGenerateRequest(config: AIConfig, record: VideoGenerationRecord): ProviderRequest {
  const model = validateModel(...)
  const is27 = this.isWan27(model)
  const isT2V = this.isTextToVideo(model)
  const isR2V = this.isRefToVideo(model)
  const isContinueMode = !!record.video_url

  if (is27) {
    body.input.prompt = prompt
    body.parameters.watermark = false
    body.parameters.seed = generateSeed() % 2147483647

    if (isT2V) {
      this.buildT2V27(body, record)      // 文生视频
    } else if (isR2V) {
      this.buildR2V27(body, record)      // 参考生视频
    } else {
      this.buildI2V27(body, record, isContinueMode)  // 图生视频/续写
    }
  } else {
    this.buildLegacy(body, record, prompt)  // 旧版本兼容
  }
}
3.1.3 万相2.7图生视频构建
private buildI2V27(body: any, record: VideoGenerationRecord, isContinueMode: boolean) {
  body.parameters.resolution = this.normalizeI2VResolution(record.resolution)
  body.parameters.duration = this.normalizeDuration27(record.duration)

  const media: any[] = []

  if (isContinueMode && record.video_url) {
    // 视频续写模式
    media.push({ type: 'first_clip', url: record.video_url })
    if (record.last_frame_url) {
      media.push({ type: 'last_frame', url: record.last_frame_url })
    }
    body.parameters.prompt_extend = false
  } else {
    // 常规图生视频
    const firstFrame = record.first_frame_url || record.image_url
    if (firstFrame) {
      media.push({ type: 'first_frame', url: firstFrame })
    }
    if (record.last_frame_url) {
      media.push({ type: 'last_frame', url: record.last_frame_url })
      body.parameters.prompt_extend = false
    } else {
      body.parameters.prompt_extend = true
    }
  }

  // 音频驱动
  if (record.audio_url) {
    media.push({ type: 'driving_audio', url: record.audio_url })
  }

  if (media.length > 0) {
    body.input.media = media
  }
}

关键技术点:

  1. 视频续写:通过 first_clip 类型传入原视频

  2. 首尾帧控制:同时支持起始帧和结束帧约束

  3. 音频驱动:支持外部音频驱动视频生成


3.2 火山引擎视频适配器

火山引擎Seedance系列模型提供了强大的视频生成能力,适配器实现了精细的模型版本适配:

3.2.1 模型差异化处理
private isProModel(model: string): boolean {
  return model.includes('seedance-1-5-pro')
}

private isSeedance20Model(model: string): boolean {
  return model.includes('seedance-2-0')
}
3.2.2 参考图处理策略
// Seedance 2.0 模型:支持首尾帧、单图参考、多参考图、视频续写
private buildSeedance20References(content: any[], record: VideoGenerationRecord): void {
  if (record.first_frame_url || record.last_frame_url) {
    // 优先使用首尾帧模式
    if (record.first_frame_url) {
      content.push({
        type: 'image_url',
        image_url: { url: record.first_frame_url },
        role: 'first_frame',
      })
    }
    if (record.last_frame_url) {
      content.push({
        type: 'image_url',
        image_url: { url: record.last_frame_url },
        role: 'last_frame',
      })
    }
  } else {
    // 备选:使用单图参考 + 多参考图
    if (record.image_url) {
      content.push({
        type: 'image_url',
        image_url: { url: record.image_url },
        role: 'reference_image',
      })
    }
    if (record.reference_image_urls) {
      const refs = limitReferenceUrls(parseReferenceUrls(record.reference_image_urls))
      for (const url of refs) {
        content.push({
          type: 'image_url',
          image_url: { url },
          role: 'reference_image',
        })
      }
    }
  }
}

模型能力对比:

模型版本

首尾帧模式

多参考图

视频续写

帧连贯性

Seedance 2.0

✅ coherence参数

1.5 Pro

Standard

部分支持


3.3 Vidu视频适配器(Webhook模式)

Vidu采用独特的Webhook回调机制,不提供轮询接口:

export class ViduVideoAdapter implements VideoProviderAdapter {
  buildPollRequest(config: AIConfig, task_id: string): ProviderRequest {
    return {
      url: 'vidu://no-polling-endpoint',  // 标记无轮询接口
      method: 'GET',
      headers: {},
      body: undefined,
    }
  }

  parsePollResponse(result: any): VideoPollResponse {
    return { status: 'processing' }  // 始终返回处理中
  }

  static parseCallbackState(body: any): { status: 'completed' | 'failed'; video_url?: string; error?: string } {
    const state = body.state
    if (state === 'success') {
      return { status: 'completed', video_url: body.video_url }
    }
    if (state === 'failed') {
      return { status: 'failed', error: body.error || 'Vidu generation failed' }
    }
    return { status: 'failed', error: `Unknown state: ${state}` }
  }
}

设计亮点:

  • 使用特殊URL协议标记无轮询接口

  • 静态方法处理Webhook回调

  • 认证使用 Token 而非标准 Bearer


四、异步任务管理机制

4.1 任务状态流转

┌─────────────────────────────────────────────────────────────┐
│                    任务状态机                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   PENDING ──→ RUNNING ──→ PROCESSING ──→ COMPLETED         │
│     │              │              │                         │
│     └──────────────┴──────────────┴──→ FAILED               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4.2 统一轮询响应解析

parsePollResponse(result: any): VideoPollResponse {
  const status = result.output?.task_status

  if (status === 'SUCCEEDED') {
    const video_url = result.output?.video_url
    if (video_url) {
      return { status: 'completed', video_url }
    }
    return { status: 'failed', error: '任务已完成但没有找到视频URL' }
  }

  if (status === 'FAILED') {
    return {
      status: 'failed',
      error: result.message || result.output?.error_message || '视频生成失败',
    }
  }

  const processingStatuses = ['PENDING', 'RUNNING', 'PROCESSING', 'QUEUED']
  if (processingStatuses.includes(status)) {
    return {
      status: 'processing',
      progress: result.output?.progress || result.output?.percent || undefined,
    }
  }

  return { status: 'pending' }
}

五、共享工具模块设计

5.1 视频质量控制

export function buildVideoNegativePrompt(style?: string | null): string {
  const base = '避免:画面模糊、人物变形、动作卡顿、光影跳变、面部崩坏、多余肢体、穿模、画面撕裂、帧率不稳、色彩失真'
  
  if (style && (style.startsWith('xianxia') || style.startsWith('xuanhuan'))) {
    return `${base}、现代元素、都市背景、现代服装、科技设备`
  }
  
  if (style && (style.startsWith('realphoto') || style === 'realistic')) {
    return `${base}、动漫感、卡通渲染、2D效果、手绘痕迹`
  }
  
  if (style && (style.startsWith('anime') || style.startsWith('3d_'))) {
    return `${base}、真人感、写实皮肤纹理、照片质感`
  }
  
  return base
}

export function buildVideoQualitySuffix(): string {
  return '画面要求:电影级画质,流畅运动,自然光影,专业摄影,构图精美,细节丰富'
}

5.2 参考图处理工具

export function parseReferenceUrls(raw: string | null | undefined): string[] {
  if (!raw) return []
  try {
    const parsed = JSON.parse(raw)
    if (Array.isArray(parsed)) {
      return parsed.map((item) => String(item || '').trim()).filter(Boolean)
    }
  } catch {}
  return []
}

export function limitReferenceUrls(urls: string[], maxCount: number = 10): string[] {
  return Array.from(new Set(urls)).slice(0, maxCount)
}

六、扩展参数机制

6.1 动态参数注入

if (config.extraParams) {
  try {
    const extraParams = typeof config.extraParams === 'string'
      ? JSON.parse(config.extraParams)
      : config.extraParams

    const allowed = is27
      ? ['negative_prompt', 'prompt_extend', 'watermark', 'seed', 'resolution', 'ratio', 'duration']
      : ['negative_prompt', 'style_strength', 'reference_strength', 'motion_bucket_id', 'fps', 'audio_prompt', 'audio_style', 'smoothness', 'frame_consistency', 'match_first_frame', 'transition_mode']

    allowed.forEach((param) => {
      if (extraParams[param] !== undefined) {
        body.parameters[param] = extraParams[param]
      }
    })
  } catch {}
}

支持的扩展参数分类:

参数类型

示例参数

作用

风格控制

style_strength, reference_strength

控制风格强度

运动控制

motion_bucket_id, smoothness

控制运动流畅度

帧一致性

frame_consistency, match_first_frame

保持帧间一致性

音频控制

audio_prompt, audio_style

配音参数


七、架构优势总结

特性

实现方式

技术价值

多平台统一

Adapter模式

屏蔽平台差异,业务层无感知

异步管理

统一轮询接口

简化任务状态管理

模型适配

版本差异化处理

充分利用各模型特性

灵活扩展

动态参数注入

支持高级功能定制

容错机制

默认适配器回退

提升系统稳定性

Webhook支持

特殊标记处理

兼容非轮询模式


八、应用场景

  1. 短视频生成:根据文本/图片快速生成营销视频

  2. 动画制作:首尾帧控制实现场景过渡

  3. 视频续写:基于已有视频继续生成后续内容

  4. 多镜头叙事:多参考图实现场景切换

  5. 自动配音:音频驱动实现口型同步


九、总结

本文深入剖析了AI视频生成服务的多Provider适配器架构,核心设计理念包括:

  1. 接口抽象:通过统一的 VideoProviderAdapter 接口屏蔽平台差异

  2. 策略模式:根据模型版本动态选择处理策略

  3. 异步管理:统一的任务轮询和状态管理机制

  4. 扩展性设计:支持动态参数注入和Webhook回调

该架构在保证代码复用性的同时,充分发挥了各视频生成平台的独特能力,是企业级视频生成服务的典型实践方案。


参考代码位置:

  • 视频适配器接口:/backend/src/services/adapters/types.ts

  • 阿里云视频适配器:/backend/src/services/adapters/ali-video.ts

  • 火山引擎适配器:/backend/src/services/adapters/volcengine-video.ts

  • Vidu适配器:/backend/src/services/adapters/vidu-video.ts

  • 共享工具模块:/backend/src/services/adapters/shared.ts

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐