fix: FFmpeg mjpeg 缩略图/封面生成添加 format=yuvj420p #1330

Merged
xiaoxia merged 1 commits from fix/thumbnail-yuv-format into develop 2026-08-10 11:44:31 +08:00
Owner

问题

FFmpeg 新版中 mjpeg 编码器拒绝非全范围 YUV 输入,导致缩略图和封面生成报错:

[mjpeg] Non full-range YUV is non-standard, set strict_std_compliance to at most unofficial to use it.
[mjpeg] ff_frame_thread_encoder_init failed
Could not open encoder before EOF
Conversion failed!

修复

在所有 mjpeg 输出的 FFmpeg 命令中添加 format=yuvj420p(全范围 JPEG YUV 像素格式):

  • thumbnail_generator.py: scale filter 添加 format=yuvj420p
  • processor.py: 添加 pix_fmt=yuvj420p
  • cover_generator.py: 两处 vf filter 添加 format=yuvj420p
  • cover_service.py: vf filter + simple fallback 添加 pix_fmt
  • asset_analyzer.py: 添加 -pix_fmt yuvj420p

测试

  • 57 个相关单测通过
  • ruff lint 通过
## 问题 FFmpeg 新版中 mjpeg 编码器拒绝非全范围 YUV 输入,导致缩略图和封面生成报错: ``` [mjpeg] Non full-range YUV is non-standard, set strict_std_compliance to at most unofficial to use it. [mjpeg] ff_frame_thread_encoder_init failed Could not open encoder before EOF Conversion failed! ``` ## 修复 在所有 mjpeg 输出的 FFmpeg 命令中添加 `format=yuvj420p`(全范围 JPEG YUV 像素格式): - `thumbnail_generator.py`: scale filter 添加 `format=yuvj420p` - `processor.py`: 添加 `pix_fmt=yuvj420p` - `cover_generator.py`: 两处 vf filter 添加 `format=yuvj420p` - `cover_service.py`: vf filter + simple fallback 添加 `pix_fmt` - `asset_analyzer.py`: 添加 `-pix_fmt yuvj420p` ## 测试 - 57 个相关单测通过 - ruff lint 通过
xiaoxia added 1 commit 2026-08-10 11:37:35 +08:00
fix: FFmpeg mjpeg 缩略图/封面生成添加 format=yuvj420p
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 31s
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 / Validate - Migration (alembic) (pull_request) Successful in 39s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m9s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m31s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m40s
AI Code Review / AI Code Review (pull_request) Successful in 1m57s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m3s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m3s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m23s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 3m51s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to 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 1m42s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 43s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 1m2s
e2b3811277
修复 FFmpeg 新版中 mjpeg 编码器拒绝非全范围 YUV 输入的问题:
- thumbnail_generator.py: scale filter 添加 format=yuvj420p
- processor.py: 添加 pix_fmt=yuvj420p
- cover_generator.py: 两处 vf filter 添加 format=yuvj420p
- cover_service.py: vf filter + simple fallback 添加 pix_fmt
- asset_analyzer.py: 添加 -pix_fmt yuvj420p

修复错误: Non full-range YUV is non-standard, set strict_std_compliance
to at most unofficial to use it.

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1330 | | 预览链接 | [https://pr-1330.preview.xiaoxiajianji.com](https://pr-1330.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

【阻塞级判定】

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

📊 审查概览

  • 整体评价:有建议
  • 建议级问题数量:2 个

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

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

  1. [apps/api/app/services/cover_service.py] 参数设置冗余

    • 具体内容:在第 218 行的 vf 滤镜链中已添加 format=yuvj420p,同时在第 261 行又添加了 -pix_fmt yuvj420p 命令行参数。两者功能重复,建议保留 -pix_fmt 参数(移除滤镜链中的 format),代码更简洁且意图明确。
  2. [全局] FFmpeg 像素格式兼容性风险

    • 具体内容:yuvj420p 像素格式在 FFmpeg 5.0+ 版本中已被标记为弃用。如果生产环境使用较新版本的 FFmpeg,可能会触发警告或在未来版本失效。建议确认运行环境的 FFmpeg 版本,或改用现代写法 yuv420p 并配合 -color_range jpeg 参数。

✅ 良好实践

  • 统一在所有视频处理相关模块中应用了相同的像素格式修复,确保了缩略图和封面生成逻辑的一致性,有效避免了色彩范围问题。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-10 03:39:32 | 模型:

### `【阻塞级判定】` - 是否存在阻塞级问题:否 - 阻塞级问题数量:0 个 ### `📊 审查概览` - 整体评价:有建议 - 建议级问题数量:2 个 ### `🔴 阻塞级问题(必须修复)` 无 ### `💡 改进建议(不阻塞合并)` 1. **[apps/api/app/services/cover_service.py] 参数设置冗余** - 具体内容:在第 218 行的 `vf` 滤镜链中已添加 `format=yuvj420p`,同时在第 261 行又添加了 `-pix_fmt yuvj420p` 命令行参数。两者功能重复,建议保留 `-pix_fmt` 参数(移除滤镜链中的 format),代码更简洁且意图明确。 2. **[全局] FFmpeg 像素格式兼容性风险** - 具体内容:`yuvj420p` 像素格式在 FFmpeg 5.0+ 版本中已被标记为弃用。如果生产环境使用较新版本的 FFmpeg,可能会触发警告或在未来版本失效。建议确认运行环境的 FFmpeg 版本,或改用现代写法 `yuv420p` 并配合 `-color_range jpeg` 参数。 ### `✅ 良好实践` - 统一在所有视频处理相关模块中应用了相同的像素格式修复,确保了缩略图和封面生成逻辑的一致性,有效避免了色彩范围问题。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-10 03:39:32 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit b85075473c into develop 2026-08-10 11:44:31 +08:00

🗑️ 预览环境已清理

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

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

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