fix(ingest): separate ffprobe and ffmpeg timeout handling in HEVC transcode #1454

Merged
auto-approve-bot merged 2 commits from fix/hevc-ffprobe-ffmpeg-timeout-separation into develop 2026-08-21 11:26:01 +08:00
Owner

问题

ffprobe (timeout=10s) 和 ffmpeg (timeout=900s) 共用同一个 try/except 块。当 ffprobe 在大文件(4K HEVC)上超时时,TimeoutExpired 被错误捕获为"FFmpeg 转码超时",整个转码流程被跳过,HEVC 原文件直接入库。

修复

将原来的单个 try/except 拆分为 3 个独立块:

  1. 磁盘空间检查 — 独立 try/except,失败只 warning,仍尝试转码
  2. ffprobe 旋转检测 — 独立 try/except,timeout 从 10s → 60s,超时/异常只 warning + _needs_rotation=False,继续执行 ffmpeg
  3. ffmpeg 转码 — 独立 try/except,只捕获自己的错误

日志精确区分:

  • ffprobe 旋转检测超时(60s),跳过旋转继续转码
  • FFmpeg 转码超时(900s),降级原始文件

验收标准

  • 语法检查通过
  • ffprobe 超时不再阻塞 ffmpeg 转码
  • 日志可区分是 ffprobe 还是 ffmpeg 超时
  • CI 通过
  • staging 部署后重新上传 HEVC 视频验证自动转码
## 问题 ffprobe (timeout=10s) 和 ffmpeg (timeout=900s) 共用同一个 try/except 块。当 ffprobe 在大文件(4K HEVC)上超时时,TimeoutExpired 被错误捕获为"FFmpeg 转码超时",整个转码流程被跳过,HEVC 原文件直接入库。 ## 修复 将原来的单个 try/except 拆分为 3 个独立块: 1. **磁盘空间检查** — 独立 try/except,失败只 warning,仍尝试转码 2. **ffprobe 旋转检测** — 独立 try/except,timeout 从 10s → 60s,超时/异常只 warning + `_needs_rotation=False`,继续执行 ffmpeg 3. **ffmpeg 转码** — 独立 try/except,只捕获自己的错误 日志精确区分: - `ffprobe 旋转检测超时(60s),跳过旋转继续转码` - `FFmpeg 转码超时(900s),降级原始文件` ## 验收标准 - [x] 语法检查通过 - [x] ffprobe 超时不再阻塞 ffmpeg 转码 - [x] 日志可区分是 ffprobe 还是 ffmpeg 超时 - [ ] CI 通过 - [ ] staging 部署后重新上传 HEVC 视频验证自动转码
xiaoxia added 1 commit 2026-08-21 11:02:13 +08:00
fix(ingest): separate ffprobe and ffmpeg timeout handling in HEVC transcode
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 44s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 26s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 29s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m46s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m2s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m24s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m35s
CI/CD Pipeline / Validate - Code Quality (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Integration Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
833a969ff7
Problem: ffprobe (timeout=10s) and ffmpeg (timeout=900s) shared a single
try/except block. When ffprobe timed out on large 4K HEVC files, the
TimeoutExpired was caught as 'FFmpeg transcode timeout' and the entire
transcode was skipped, leaving HEVC files unconverted.

Fix:
- Split into 3 independent try/except blocks:
  1. Disk space check (warning-only, continues even on failure)
  2. ffprobe rotation detection (timeout 10s -> 60s, failure sets
     _needs_rotation=False and continues to ffmpeg)
  3. ffmpeg transcode (isolated, only catches its own errors)
- Distinct log messages for each failure mode:
  - 'ffprobe 旋转检测超时(60s)' vs 'FFmpeg 转码超时(900s)'
- ffprobe failure no longer blocks the entire transcode pipeline

🚀 预览环境已部署

项目 详情
PR号 #1454
预览链接 https://pr-1454.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1454 | | 预览链接 | [https://pr-1454.preview.xiaoxiajianji.com](https://pr-1454.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
auto-approve-bot added 1 commit 2026-08-21 11:06:11 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 47s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 24s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 28s
AI Code Review / AI Code Review (pull_request) Successful in 1m46s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m51s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m19s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m33s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m50s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m38s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 9m40s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 5m56s
CI/CD Pipeline / CI Gate (pull_request) Successful in 9s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 48s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m9s
16dbf27cf0
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:否
  • 阻塞级问题数量:0 个

📊 审查概览

  • 整体评价:通过
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

💡 改进建议(不阻塞合并)

  1. [apps/worker/worker_app/tasks/ingest.py: 252, 282] 魔法值提取为常量
    • 具体内容:代码中硬编码了磁盘空间阈值 2 (GB) 和 ffprobe 超时时间 60 (秒)。建议将此类配置项提取为模块级常量或配置文件变量,便于后续维护和调整,例如 MIN_DISK_FREE_GB = 2FFPROBE_TIMEOUT = 60

良好实践

  1. 防御性编程:将磁盘检查和 ffprobe 旋转检测放入独立的 try/except 块中,并设置为“失败不阻塞主流程”,这是一种很好的容错设计,避免了因辅助检查失败而导致整个转码任务中断。
  2. 参数化命令调用:使用列表形式(["ffprobe", ...])调用子进程,有效防范了命令注入风险。
  3. 日志增强:在 FFmpeg 转码失败时增加了 stderr 的尾部内容输出,这能极大提升线上问题的排查效率。
  4. 异常处理精细化:针对 subprocess.TimeoutExpired 进行了单独捕获,区分了超时和异常错误,逻辑更清晰。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-21 03:07:57 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### 📊 审查概览 - 整体评价:通过 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 无 ### 💡 改进建议(不阻塞合并) 1. **[apps/worker/worker_app/tasks/ingest.py: 252, 282] 魔法值提取为常量** - 具体内容:代码中硬编码了磁盘空间阈值 `2` (GB) 和 ffprobe 超时时间 `60` (秒)。建议将此类配置项提取为模块级常量或配置文件变量,便于后续维护和调整,例如 `MIN_DISK_FREE_GB = 2` 和 `FFPROBE_TIMEOUT = 60`。 ### ✅ 良好实践 1. **防御性编程**:将磁盘检查和 ffprobe 旋转检测放入独立的 `try/except` 块中,并设置为“失败不阻塞主流程”,这是一种很好的容错设计,避免了因辅助检查失败而导致整个转码任务中断。 2. **参数化命令调用**:使用列表形式(`["ffprobe", ...]`)调用子进程,有效防范了命令注入风险。 3. **日志增强**:在 FFmpeg 转码失败时增加了 `stderr` 的尾部内容输出,这能极大提升线上问题的排查效率。 4. **异常处理精细化**:针对 `subprocess.TimeoutExpired` 进行了单独捕获,区分了超时和异常错误,逻辑更清晰。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-21 03:07:57 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-21 11:20:31 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

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

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit f08a2bfa0d into develop 2026-08-21 11:26:01 +08:00
auto-approve-bot deleted branch fix/hevc-ffprobe-ffmpeg-timeout-separation 2026-08-21 11:26:02 +08:00

🗑️ 预览环境已清理

PR #1454 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1454 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.