Commit Graph

3 Commits

Author SHA1 Message Date
xiaoxia e68801eb59 fix(ingest): 转码滤镜改按长边 1920 封顶(修复超宽屏误降级)+ 合并 ffprobe
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (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 / Check if frontend-only change (pull_request) Successful in 2m6s
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 API Image (pull_request) Successful in 1m46s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 28s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m28s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 6m18s
AI Code Review / AI Code Review (pull_request) Successful in 9m20s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 13m37s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 15m54s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 21m45s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 29m4s
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 20m45s
CI/CD Pipeline / CI Gate (pull_request) Successful in 1m7s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 4m14s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 4m46s
Code Review 阻塞问题修复 + 建议采纳:

1. 缩放规则与校验规则对齐(真 bug):
   旧滤镜仅按短边 1080 触发缩放(横屏看 ih、竖屏看 iw),对超宽屏
   (如 4000x1000)短边不超 1080 完全不缩放,产物长边 4000 超过
   validate_transcode_output 的 1920 上限,转码被判定失败而降级用
   原始 HEVC——浏览器仍无法播放。改为统一滤镜:
     scale=w=if(gte(iw\,ih)\,min(1920\,iw)\,-2):
           h=if(gt(ih\,iw)\,min(1920\,ih)\,-2),format=yuv420p
   横屏限宽、竖屏限高、短边 -2 自适应,min() 保证小视频不放大;
   build_transcode_vf 不再需要 is_portrait 参数(方向无关)。
   ffmpeg 实测:1920x1080→1920x1080、4K竖屏→1080x1920、
   4000x1000→1920x480、1080x2400→864x1920、640x360 不放大,均无 side data。

2. 合并 ffprobe(性能建议):新增 probe_video_info(path) 一次
   -show_streams -of json 同时解析 width/height 与 Display Matrix
   rotation(用全量 JSON 输出,规避 show_entries 嵌套 section 名在
   ffmpeg 4.x/7.x 不一致的问题);主流程两次探测合并为一次。
   probe_rotation/probe_dimensions 保留供测试与 validate 复用。

3. 临时文件清理:转码 try 块 finally 中 _tc_tmp.unlink() 在 #1449
   即已存在(develop 基线代码),本轮 review 该条为窗口外误判,
   已在 PR 评论说明。

测试:
- TestBuildTranscodeVF 重写为统一滤镜断言(逗号转义、无 transpose、
  横竖双分支 min(1920)、yuv420p 后缀)。
- 新增 TestProbeVideoInfo(真实 ffprobe 320x240 无 rotation;
  不存在文件返回三元 None)。
- 端到端新增 test_ultra_wide_long_edge_capped(4000x1000→1920x480
  且 validate 通过);_transcode_like_production 改用 probe_video_info
  + 无参 build_transcode_vf,与生产完全一致。
- 任务级竖屏用例滤镜特征断言更新为 min(1920)。
2026-08-30 21:09:43 +08:00
xiaoxia b03d19cf32 fix(ingest): 方向判定改为按显示方向(物理竖屏 rotation=0 不再误判横屏)
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
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 / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (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 / Check if frontend-only change (pull_request) Successful in 2m30s
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 API Image (pull_request) Successful in 1m18s
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m6s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m19s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 31s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m26s
AI Code Review / AI Code Review (pull_request) Failing after 7m44s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 8m21s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 10m34s
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
Code Review 阻塞问题修复:

旧逻辑仅以 rotation side data 判定竖屏(is_portrait_rotation),对
"已物理旋转、存储即 h>w、rotation=0/None"的竖屏视频(Android 拍摄常见)
会误判为横屏:套用横屏按高缩放滤镜把 1080x1920 压成 608x1080,产物被
validate_transcode_output 拦截后降级使用原始 HEVC 文件——此类视频在
浏览器仍无法播放(HEVC 黑帧),转码链路对这类素材完全失效。

修复:
- 新增 is_portrait_video(stored_w, stored_h, rotation):rotation 为
  90/270/-90 时显示宽高相对存储维度互换,否则显示方向即存储维度,按
  显示 h>w 判定竖屏;维度探测失败时退回仅看 rotation。
- 主流程 Step 2 同时 probe 源文件维度与 rotation,按显示方向选滤镜。
- is_portrait_rotation 保留并补充注释(仅覆盖 iOS 风格 side data)。

测试补充:
- TestIsPortraitVideo:iOS 风格(1920x1080+rotation90)、物理竖屏
  (1080x1920 无 rotation)、横屏、rotation=180 不互换、探测失败回退。
- 端到端新增 test_physical_portrait_hevc_no_rotation:真实 ffmpeg 造
  1080x1920 无 side data 的 HEVC,断言转码后仍为 1080x1920 h264。
- 任务级新增 test_physical_portrait_no_rotation_still_transcodes:
  断言物理竖屏也走转码、改写 storage_key、使用按宽缩放滤镜。
- FONT 改为多路径候选查找,缺失时 drawtext 降级(仅红条标记),
  测试不再硬依赖 Debian 字体路径。

注:转码临时文件的 finally 清理逻辑在 #1449 中已存在(ingest.py
转码 try 块 finally 段 unlink _tc_tmp),本次审查该条为窗口外误判。
2026-08-30 20:41:33 +08:00
xiaoxia 18aed0c34b fix(ingest): 修复竖屏 HEVC 转码方向错误(双重旋转/ffprobe 取错行/逗号转义)
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
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 / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (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 / Check if frontend-only change (pull_request) Successful in 3m1s
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
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 3m39s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m19s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m24s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m35s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m50s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 7m51s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 8m43s
AI Code Review / AI Code Review (pull_request) Successful in 9m14s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 17m57s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 16m37s
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) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
竖屏 iPhone HEVC 素材转码后方向错乱(竖屏变横屏),实测定位三个根因:

1. 双重旋转:ffmpeg 默认 autorotate 已按 display matrix 物理旋转画面,
   代码又显式追加 transpose=1,导致 r90 竖屏被转成 1920x1080 横屏。
   旋转全部交给 autorotate,滤镜只做 scale。
2. ffprobe 取错行:探测命令同时输出 side_data=rotation 和
   stream_tags=rotate 两行(r90 文件输出 270/90 两行),split("\n")[0]
   取到 270,方向判定反了。改为只读 side_data 单行并 int 化。
3. scale 表达式逗号未转义:if(gt(ih,1080),...) 中的裸逗号被当作
   filter 分隔,报 Invalid size。统一用 \, 转义(raw string 字面量)。

附带修复:
- 竖屏按宽、横屏按高缩放(旋转后竖屏 w<h,旧代码竖屏沿用按高缩放
  会把 1080x1920 错缩为 608x1080),长边封顶 1080 只缩不放。
- 移除无效的 -metadata:s:v:0 rotate=0(实测清不掉 display matrix
  side data,autorotate 方案产物本身已无 side data)。
- 转码后强制方向/维度校验 validate_transcode_output:竖屏产物必须
  h>w、横屏 w>=h、长边 <=1920、无残留 rotation side data;校验失败
  打 error 日志并降级使用原始文件、不上传 OSS,杜绝横屏文件覆盖。

测试:
- test_ingest_hevc_transcode.py 重写(22 用例):纯逻辑断言 +
  真实 ffmpeg 端到端(r90/r270/横屏/4K 素材造 display matrix,
  断言 1080x1920 / 1920x1080 / h264 / 无 side data / 缩略图竖版)。
- test_ingest_hevc_transcode_task.py 新增(4 用例):任务级 mock
  验证成功改写 storage_key、校验失败降级+error 日志、ffmpeg 非零
  降级、非 HEVC 不转码。
2026-08-30 19:57:46 +08:00