gongxiangp2/docs/视频转码配置说明.md

7.5 KiB
Raw Blame History

视频转码配置说明

概述

由壹点3D素材平台支持视频素材的自动转码功能,可以将上传的视频转换为适合在线预览的格式。

环境要求

1. FFmpeg

视频转码需要 FFmpeg 工具。在 Docker 环境中,FFmpeg 已经在 Dockerfile 中安装:

RUN apk add --no-cache ffmpeg

2. 环境变量配置

在 docker-compose.yml 或 .env 文件中配置以下环境变量:

# 视频转码编码器(推荐使用 libx265,压缩率更高)
VIDEO_TRANSCODE_CODEC=libx265

# 转码预设(速度与质量的平衡)
# 可选值:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
# 推荐:medium(平衡速度和质量)
VIDEO_TRANSCODE_PRESET=medium

# 恒定质量因子(CRF,控制视频质量)
# 范围:0-51,数值越小质量越高,文件越大
# 推荐:22-28(22 为高质量,28 为较低质量)
VIDEO_TRANSCODE_CRF=22

# 音频比特率
# 推荐:128k-192k(128k 为标准质量,192k 为高质量)
VIDEO_AUDIO_BITRATE=160k

3. Redis 配置(可选)

如果需要使用 Redis 管理转码队列(推荐用于生产环境),需要配置:

# 启用 Redis
USE_REDIS=true

# Redis 连接地址
REDIS_URL=redis://localhost:6379

注意:

  • 如果不配置 Redis,系统会使用内存队列(重启后队列会丢失)
  • 生产环境强烈推荐使用 Redis,确保转码任务不会因为重启而丢失

转码流程

1. 上传视频

用户上传视频素材时,系统会:

  1. 保存原始视频文件到 S3
  2. 创建素材记录,设置 videoProcessingStatus = 'pending'
  3. 将转码任务加入队列

2. 转码处理

转码队列会自动处理待转码的视频:

  1. 从队列中取出任务
  2. 下载原始视频
  3. 使用 FFmpeg 转码:
    • 生成 540p 预览视频(videoPreview540Url)
    • 生成 10 秒预览片段(videoPreviewClipUrl)
    • 提取视频封面(videoCoverUrl)
  4. 上传转码后的文件到 S3
  5. 更新素材记录,设置 videoProcessingStatus = 'completed'

3. 转码失败处理

如果转码失败:

  1. 系统会记录错误信息到 transcodeLastError 字段
  2. 增加重试次数(transcodeAttempts)
  3. 如果重试次数超过限制(默认 3 次),标记为 failed
  4. 用户可以在前端手动重试转码

API 接口

查询转码状态

GET /api/materials/transcode?materialId=xxx

响应示例:

{
  "status": "processing",
  "progress": 45,
  "message": "正在转码中..."
}

启动转码任务

POST /api/materials/transcode
Content-Type: application/json

{
  "materialId": "xxx"
}

响应示例:

{
  "message": "转码任务已启动",
  "status": "processing"
}

转码参数说明

VIDEO_TRANSCODE_CODEC

libx264(H.264):

  • 优点:兼容性好,几乎所有设备都支持
  • 缺点:文件较大
  • 适用场景:需要最大兼容性的场景

libx265(H.265/HEVC):

  • 优点:压缩率高,文件小,画质好
  • 缺点:编码速度较慢,部分老设备不支持
  • 适用场景:追求高画质和小文件的场景(推荐)

VIDEO_TRANSCODE_PRESET

速度从快到慢:

  • ultrafast:最快,质量最差
  • superfast:很快,质量较差
  • veryfast:快,质量一般
  • faster:较快,质量较好
  • fast:快,质量好
  • medium:平衡(推荐)
  • slow:慢,质量很好
  • slower:很慢,质量极好
  • veryslow:最慢,质量最好

推荐配置:

  • 开发环境:fast 或 faster(快速测试)
  • 生产环境:medium(平衡速度和质量)
  • 高质量需求:slow(追求极致画质)

VIDEO_TRANSCODE_CRF

CRF(Constant Rate Factor)控制视频质量:

  • 0:无损(文件极大,不推荐)
  • 18-22:高质量(推荐用于重要视频)
  • 23-28:标准质量(推荐用于一般视频)
  • 29-35:较低质量(不推荐)
  • 51:最低质量(不推荐)

推荐配置:

  • 高质量:20-22
  • 标准质量:23-25(推荐)
  • 节省空间:26-28

VIDEO_AUDIO_BITRATE

音频比特率控制音频质量:

  • 96k:低质量(不推荐)
  • 128k:标准质量
  • 160k:较高质量(推荐)
  • 192k:高质量
  • 256k:极高质量(文件较大)

生产环境配置示例

正式系统(docker-compose.yml)

environment:
  # 视频转码配置
  - VIDEO_TRANSCODE_CODEC=libx265
  - VIDEO_TRANSCODE_PRESET=medium
  - VIDEO_TRANSCODE_CRF=22
  - VIDEO_AUDIO_BITRATE=160k
  # Redis 配置(可选)
  - USE_REDIS=true
  - REDIS_URL=redis://redis:6379

影子系统(docker-compose.shadow.yml)

影子系统已经配置了完整的视频转码环境,包括:

  • 独立的 Redis 实例(端口 6380)
  • 完整的转码环境变量
  • 独立的 uploads 目录

监控和排查

查看转码统计

管理员可以访问以下 API 查看转码统计:

GET /api/admin/video-transcode-stats

响应示例:

{
  "pending": 5,
  "processing": 2,
  "completed": 150,
  "failed": 3,
  "recentFailures": [
    {
      "id": "xxx",
      "productModel": "产品名称",
      "transcodeLastError": "FFmpeg 转码失败:...",
      "transcodeAttempts": 3,
      "createdAt": "2025-12-20T10:00:00Z"
    }
  ]
}

常见问题

1. 转码失败:FFmpeg not found

原因:Docker 镜像中没有安装 FFmpeg

解决:

  1. 确认 Dockerfile 中已添加 ffmpeg 到 apk 安装列表
  2. 重新构建镜像:docker compose build
  3. 重启容器:docker compose up -d

2. 转码速度很慢

原因:转码预设太慢(如 slow 或 slower)

解决:

  1. 调整 VIDEO_TRANSCODE_PRESET 为 medium 或 fast
  2. 重启容器使配置生效

3. 转码后文件太大

原因:CRF 值太小(质量太高)

解决:

  1. 调整 VIDEO_TRANSCODE_CRF 为 25-28
  2. 或使用 libx265 编码器(压缩率更高)

4. 转码队列卡住

原因:

  • 转码任务失败但状态未更新
  • Redis 连接失败
  • 内存队列因重启丢失

解决:

  1. 查看转码统计 API,确认是否有 processing 状态的任务
  2. 如果有卡住的任务,可以手动重置状态:
    UPDATE materials 
    SET "videoProcessingStatus" = 'pending' 
    WHERE "videoProcessingStatus" = 'processing';
    
  3. 重启容器,队列会自动恢复

性能优化建议

1. 使用 Redis

生产环境强烈推荐使用 Redis:

  • 转码任务持久化,重启不丢失
  • 支持分布式部署(多个转码节点)
  • 更好的队列管理和监控

2. 调整转码参数

根据实际需求调整参数:

  • 如果用户主要在移动端观看:使用 libx265 + CRF 25
  • 如果追求极致画质:使用 libx265 + CRF 20 + slow
  • 如果需要快速转码:使用 libx264 + CRF 23 + fast

3. 分离转码服务

如果转码任务很多,可以考虑:

  • 部署独立的转码服务器
  • 使用消息队列(如 RabbitMQ)管理任务
  • 使用 GPU 加速转码(需要支持 NVENC 的 FFmpeg)

总结

视频转码功能已经完整实现,包括:

  • ✅ FFmpeg 已在 Dockerfile 中安装
  • ✅ 环境变量已在 docker-compose.yml 中配置
  • ✅ 转码 API 已实现(查询状态、启动任务)
  • ✅ 转码队列已实现(支持 Redis 和内存队列)
  • ✅ 错误处理和重试机制已实现
  • ✅ 管理员监控 API 已实现

下一步:

  1. 重新构建 Docker 镜像(包含 FFmpeg)
  2. 部署到正式环境
  3. 测试视频上传和转码功能
  4. 监控转码队列状态