fix: 渲染失败三重修复 - legacy帧率统一 + HEVC编码过滤 + 横屏过滤 #494
Reference in New Issue
Block a user
Delete Branch "fix/hevc-encoding-filter-and-auto-select"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
一键生成渲染失败(ffmpeg exit=234)。根因分析发现三个独立问题叠加:
_build_clip_filter有fps参数但完全未使用,concat filter 要求所有输入帧率一致,19fps vs 30fps 素材混排必现失败修复内容
1. legacy路径 fps 滤镜统一帧率(P0核心修复)
apps/api/app/services/video_compose_service.py_build_clip_filter在 crop 后增加fps=DEFAULT_FPS滤镜2. 自动选素材 - 编码格式过滤(P1兜底)
asset.codec字段,fallback 到metadata.codec(兼容存量)3. 自动选素材 - 横屏视频过滤(P2优化)
4. ingest 编码格式校验 + codec字段写入
_is_valid_media白名单:仅 H.264/avc1 编码视频标记为有效Asset.create均补充codec参数(之前只写在 metadata 里)测试
我将基于您提供的代码 Diff 进行严格审查。
代码审查结果 - PR #494
⚠️ 问题(2个需要修改)
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,这样更安全且易于维护。apps/worker/worker_app/tasks/ingest.py 第30行:定义了未使用的常量
UNSUPPORTED_VIDEO_CODECS。UNSUPPORTED_VIDEO_CODECS集合,但在_is_valid_media函数中实际使用的是SUPPORTED_VIDEO_CODECS进行白名单校验。未使用的常量会造成混淆,让人误以为代码依赖黑名单逻辑。UNSUPPORTED_VIDEO_CODECS常量定义,或者补充注释说明其保留用途(例如用于日志提示),但当前代码中并未用于日志,建议直接删除。💡 建议(1个可选)
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 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
fix: 自动选素材过滤HEVC等不支持编码 + ingest编码格式校验to fix: 渲染失败三重修复 - legacy帧率统一 + HEVC编码过滤 + 横屏过滤