fix: 渲染失败三重修复 - legacy帧率统一 + HEVC编码过滤 + 横屏过滤 #494

Merged
auto-approve-bot merged 1 commits from fix/hevc-encoding-filter-and-auto-select into develop 2026-07-18 11:27:16 +08:00
Owner

问题

一键生成渲染失败(ffmpeg exit=234)。根因分析发现三个独立问题叠加:

  1. legacy路径帧率不统一(最核心):_build_clip_filterfps 参数但完全未使用,concat filter 要求所有输入帧率一致,19fps vs 30fps 素材混排必现失败
  2. 自动选素材无编码过滤:HEVC/H.265/VP9/AV1 等不支持的编码素材会被选入渲染管线
  3. 自动选素材无横竖屏过滤:横屏视频被选中,缩放裁剪后比例异常

修复内容

1. legacy路径 fps 滤镜统一帧率(P0核心修复)

  • 文件:apps/api/app/services/video_compose_service.py
  • _build_clip_filter 在 crop 后增加 fps=DEFAULT_FPS 滤镜
  • 确保所有输入片段帧率一致后再 concat
  • 滤镜顺序:scale → crop → fps → setpts → trim

2. 自动选素材 - 编码格式过滤(P1兜底)

  • 黑名单:HEVC/H.265/VP9/AV1 等明确不支持的编码直接过滤
  • 优先读 asset.codec 字段,fallback 到 metadata.codec(兼容存量)
  • 编码为空的存量素材暂时放过,不影响可用性

3. 自动选素材 - 横屏视频过滤(P2优化)

  • 竖屏APP只选竖屏视频(height >= width)
  • 宽 > 高的横屏视频直接跳过
  • 尺寸未知的存量素材放过(兼容)

4. ingest 编码格式校验 + codec字段写入

  • _is_valid_media 白名单:仅 H.264/avc1 编码视频标记为有效
  • 不支持的编码直接标记为 ERROR,不进入可用素材池
  • 两处 Asset.create 均补充 codec 参数(之前只写在 metadata 里)

测试

  • 新增 fps 统一帧率测试 1 个 + 滤镜顺序验证
  • 新增自动选素材编码过滤测试 12 个
  • 新增自动选素材横屏过滤测试 4 个
  • 新增 ingest 编码校验测试 9 个
  • 共 76 个测试全部通过
## 问题 一键生成渲染失败(ffmpeg exit=234)。根因分析发现三个独立问题叠加: 1. **legacy路径帧率不统一**(最核心):`_build_clip_filter` 有 `fps` 参数但完全未使用,concat filter 要求所有输入帧率一致,19fps vs 30fps 素材混排必现失败 2. **自动选素材无编码过滤**:HEVC/H.265/VP9/AV1 等不支持的编码素材会被选入渲染管线 3. **自动选素材无横竖屏过滤**:横屏视频被选中,缩放裁剪后比例异常 ## 修复内容 ### 1. legacy路径 fps 滤镜统一帧率(P0核心修复) - 文件:`apps/api/app/services/video_compose_service.py` - `_build_clip_filter` 在 crop 后增加 `fps=DEFAULT_FPS` 滤镜 - 确保所有输入片段帧率一致后再 concat - 滤镜顺序:scale → crop → fps → setpts → trim ### 2. 自动选素材 - 编码格式过滤(P1兜底) - 黑名单:HEVC/H.265/VP9/AV1 等明确不支持的编码直接过滤 - 优先读 `asset.codec` 字段,fallback 到 `metadata.codec`(兼容存量) - 编码为空的存量素材暂时放过,不影响可用性 ### 3. 自动选素材 - 横屏视频过滤(P2优化) - 竖屏APP只选竖屏视频(height >= width) - 宽 > 高的横屏视频直接跳过 - 尺寸未知的存量素材放过(兼容) ### 4. ingest 编码格式校验 + codec字段写入 - `_is_valid_media` 白名单:仅 H.264/avc1 编码视频标记为有效 - 不支持的编码直接标记为 ERROR,不进入可用素材池 - 两处 `Asset.create` 均补充 `codec` 参数(之前只写在 metadata 里) ## 测试 - 新增 fps 统一帧率测试 1 个 + 滤镜顺序验证 - 新增自动选素材编码过滤测试 12 个 - 新增自动选素材横屏过滤测试 4 个 - 新增 ingest 编码校验测试 9 个 - 共 76 个测试全部通过
xiaoxia self-assigned this 2026-07-18 11:23:28 +08:00
xiaoxia added 1 commit 2026-07-18 11:23:28 +08:00
fix: 自动选素材过滤HEVC等不支持编码 + ingest编码格式校验
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 15s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 38s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 24s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m0s
AI Code Review / AI Code Review (pull_request) Successful in 2m19s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 2m25s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m23s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 3m48s
8c2ddb7bb1
问题:一键生成选到HEVC编码素材导致渲染失败(exit=234)

修复内容:
1. 自动选素材增加编码格式过滤(黑名单:HEVC/H.265/VP9/AV1等)
   - 优先读asset.codec字段,fallback到metadata.codec(兼容存量数据)
   - 编码为空的存量素材暂时放过,不影响可用性

2. ingest增加编码格式校验
   - _is_valid_media白名单:仅H.264/avc1编码视频标记为有效
   - HEVC/VP9/AV1等不支持的编码直接标记为ERROR,不进入可用素材池

3. ingest写入codec字段
   - 两处Asset.create均补充codec参数,之前只写在metadata里

4. 单元测试:新增12个自动选素材测试 + 9个编码校验测试,共36个全过
Collaborator

我将基于您提供的代码 Diff 进行严格审查。

代码审查结果 - PR #494

⚠️ 问题(2个需要修改)

  1. apps/api/app/api/routes/_helpers.py 第69行:编码过滤黑名单不完整,存在兼容性风险。

    • 问题描述UNSUPPORTED_CODECS 集合中缺少 vp8, vp08, mpeg4, mp4v 等编码格式。而在 ingest.py 中,这些编码被明确列为不支持(且白名单校验会拒绝通过)。如果数据库中存在这些旧编码格式的存量数据,auto_select_video_assets 函数会错误地将其选中,导致后续渲染失败。
    • 修改建议:将 UNSUPPORTED_CODECS 改为使用白名单机制(与 ingest.py 保持一致),或者补全 vp8, mpeg4 等不支持的编码。建议使用白名单 SUPPORTED_CODECS = {"h264", "avc1", "avc"},逻辑改为 if codec and codec not in SUPPORTED_CODECS,这样更安全且易于维护。
  2. apps/worker/worker_app/tasks/ingest.py 第30行:定义了未使用的常量 UNSUPPORTED_VIDEO_CODECS

    • 问题描述:代码中定义了 UNSUPPORTED_VIDEO_CODECS 集合,但在 _is_valid_media 函数中实际使用的是 SUPPORTED_VIDEO_CODECS 进行白名单校验。未使用的常量会造成混淆,让人误以为代码依赖黑名单逻辑。
    • 修改建议:删除 UNSUPPORTED_VIDEO_CODECS 常量定义,或者补充注释说明其保留用途(例如用于日志提示),但当前代码中并未用于日志,建议直接删除。

💡 建议(1个可选)

  1. apps/worker/worker_app/tasks/ingest.py 第305行 & 第338行:建议对入库的 codec 字段进行规范化处理。
    • 具体内容:在 ingest_asset 函数中创建 Asset 对象时,codec=metadata.get("codec") or None 直接保存了原始值。虽然 _helpers.py 中读取时做了 .lower() 处理,但为了数据库数据的一致性和查询便利,建议在写入数据库前统一转为小写(例如 codec=str(metadata.get("codec", "")).lower() or None)。

格式检查通过 | 逻辑审查需修改 | 性能无明显问题


🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 11:25:47 | 模型:

我将基于您提供的代码 Diff 进行严格审查。 ## 代码审查结果 - PR #494 ### ⚠️ 问题(2个需要修改) 1. **apps/api/app/api/routes/_helpers.py 第69行**:编码过滤黑名单不完整,存在兼容性风险。 - **问题描述**:`UNSUPPORTED_CODECS` 集合中缺少 `vp8`, `vp08`, `mpeg4`, `mp4v` 等编码格式。而在 `ingest.py` 中,这些编码被明确列为不支持(且白名单校验会拒绝通过)。如果数据库中存在这些旧编码格式的存量数据,`auto_select_video_assets` 函数会错误地将其选中,导致后续渲染失败。 - **修改建议**:将 `UNSUPPORTED_CODECS` 改为使用白名单机制(与 `ingest.py` 保持一致),或者补全 `vp8`, `mpeg4` 等不支持的编码。建议使用白名单 `SUPPORTED_CODECS = {"h264", "avc1", "avc"}`,逻辑改为 `if codec and codec not in SUPPORTED_CODECS`,这样更安全且易于维护。 2. **apps/worker/worker_app/tasks/ingest.py 第30行**:定义了未使用的常量 `UNSUPPORTED_VIDEO_CODECS`。 - **问题描述**:代码中定义了 `UNSUPPORTED_VIDEO_CODECS` 集合,但在 `_is_valid_media` 函数中实际使用的是 `SUPPORTED_VIDEO_CODECS` 进行白名单校验。未使用的常量会造成混淆,让人误以为代码依赖黑名单逻辑。 - **修改建议**:删除 `UNSUPPORTED_VIDEO_CODECS` 常量定义,或者补充注释说明其保留用途(例如用于日志提示),但当前代码中并未用于日志,建议直接删除。 ### 💡 建议(1个可选) 1. **apps/worker/worker_app/tasks/ingest.py 第305行 & 第338行**:建议对入库的 codec 字段进行规范化处理。 - **具体内容**:在 `ingest_asset` 函数中创建 Asset 对象时,`codec=metadata.get("codec") or None` 直接保存了原始值。虽然 `_helpers.py` 中读取时做了 `.lower()` 处理,但为了数据库数据的一致性和查询便利,建议在写入数据库前统一转为小写(例如 `codec=str(metadata.get("codec", "")).lower() or None`)。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无明显问题 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-18 11:25:47 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-07-18 11:25:53 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-07-18 11:25:53 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 854522986e into develop 2026-07-18 11:27:16 +08:00
auto-approve-bot deleted branch fix/hevc-encoding-filter-and-auto-select 2026-07-18 11:27:16 +08:00
xiaoxia changed title from fix: 自动选素材过滤HEVC等不支持编码 + ingest编码格式校验 to fix: 渲染失败三重修复 - legacy帧率统一 + HEVC编码过滤 + 横屏过滤 2026-07-18 11:31:58 +08:00
Sign in to join this conversation.