Files
myshell-ai-ComfyUI-ShellAge…/verify_integration.py
T
ArxchiboboandClaude Sonnet 4.5 a15d4b255e feat: 集成H.264高级编码功能,支持yuv420p/yuv444p格式
新增功能:
- 添加3个新视频格式: h264-advanced, h264-high444, ffmpeg-manual
- 新增9个高级参数: preset, tune, crf, pix_fmt, colorspace等
- 支持yuv420p (Mac兼容) 和 yuv444p (专业后期) 像素格式
- 实现三级模式: 标准模式/高级模式/手动模式
- 自动处理High444 profile和色彩元数据

代码改进:
- 优化VIDEO_FORMATS字典,添加兼容性标记
- 扩展INPUT_TYPES,添加完整的高级参数支持
- 增强_create_video方法,智能处理不同模式
- 调整默认CRF值从19到20 (Mac推荐值)

文档新增:
- VIDEO_FORMATS_GUIDE.md: YUV格式完整教程
- QUICK_REFERENCE.md: 快速参考卡片
- USAGE_GUIDE.md: 详细使用指南
- INTEGRATION_SUMMARY.md: 技术整合总结
- COMPLETION_REPORT.md: 完成报告

工具脚本:
- simple_check.py: 简单验证脚本
- verify_integration.py: 完整验证脚本

h264-high444模块:
- 独立的H.264 High 4:4:4编码节点
- 支持专业yuv444p格式
- 完整的色彩管理和高级参数

技术亮点:
- 向后兼容,不影响现有工作流
- 默认配置确保Mac/iOS兼容性
- 清晰的兼容性标注和中文提示
- 完善的三层文档体系

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 13:34:12 +08:00

262 lines
7.6 KiB
Python

#!/usr/bin/env python3
"""
视频格式集成验证脚本
用途:
1. 验证output_video_encrypt.py的语法正确性
2. 检查VIDEO_FORMATS字典的完整性
3. 验证新增格式的配置
4. 生成格式配置报告
"""
import sys
import os
def check_file_exists():
"""检查文件是否存在"""
file_path = "comfy-nodes/output_video_encrypt.py"
if not os.path.exists(file_path):
print(f"❌ 文件不存在: {file_path}")
return False
print(f"✅ 文件存在: {file_path}")
return True
def check_syntax():
"""检查Python语法"""
import py_compile
try:
py_compile.compile("comfy-nodes/output_video_encrypt.py", doraise=True)
print("✅ Python语法检查通过")
return True
except py_compile.PyCompileError as e:
print(f"❌ 语法错误: {e}")
return False
def check_video_formats():
"""检查VIDEO_FORMATS字典"""
# 临时导入模块
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
try:
# 动态导入
import importlib.util
spec = importlib.util.spec_from_file_location(
"output_video_encrypt",
"comfy-nodes/output_video_encrypt.py"
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
VIDEO_FORMATS = module.VIDEO_FORMATS
print(f"\n✅ VIDEO_FORMATS加载成功,共 {len(VIDEO_FORMATS)} 个格式:\n")
# 预期的格式
expected_formats = [
"h264-mp4",
"h265-mp4",
"vp9-webm",
"avi",
"mov",
"h264-advanced",
"h264-high444",
"ffmpeg-manual"
]
# 检查每个格式
for fmt_name in expected_formats:
if fmt_name in VIDEO_FORMATS:
fmt_config = VIDEO_FORMATS[fmt_name]
compat = fmt_config.get("compatible", "unknown")
desc = fmt_config.get("description", "无描述")
compat_icon = {
True: "✅",
False: "❌",
"depends": "⚠️",
"unknown": "❓"
}.get(compat, "❓")
print(f" {compat_icon} {fmt_name}: {desc}")
# 检查关键字段
required_fields = ["extension", "main_pass", "dim_alignment"]
missing = [f for f in required_fields if f not in fmt_config]
if missing:
print(f" ⚠️ 缺少字段: {', '.join(missing)}")
else:
print(f" ❌ 缺少格式: {fmt_name}")
return True
except Exception as e:
print(f"❌ 加载VIDEO_FORMATS失败: {e}")
import traceback
traceback.print_exc()
return False
def check_advanced_parameters():
"""检查高级参数"""
print("\n检查高级参数定义:")
expected_params = [
"advanced_preset",
"advanced_tune",
"advanced_crf",
"advanced_pix_fmt",
"advanced_colorspace",
"advanced_color_range",
"advanced_x264_params",
"manual_videocodec",
"manual_audio_codec"
]
# 读取文件内容检查
with open("comfy-nodes/output_video_encrypt.py", 'r', encoding='utf-8') as f:
content = f.read()
found_params = []
missing_params = []
for param in expected_params:
if f'"{param}"' in content or f"'{param}'" in content:
found_params.append(param)
print(f" ✅ {param}")
else:
missing_params.append(param)
print(f" ❌ {param} (未找到)")
if missing_params:
print(f"\n⚠️ 缺少参数: {', '.join(missing_params)}")
return False
else:
print(f"\n✅ 所有 {len(expected_params)} 个高级参数都已定义")
return True
def generate_format_report():
"""生成格式配置报告"""
print("\n" + "="*60)
print("视频格式配置报告")
print("="*60)
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
try:
import importlib.util
spec = importlib.util.spec_from_file_location(
"output_video_encrypt",
"comfy-nodes/output_video_encrypt.py"
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
VIDEO_FORMATS = module.VIDEO_FORMATS
# 按兼容性分类
compatible = []
incompatible = []
depends = []
for fmt_name, fmt_config in VIDEO_FORMATS.items():
compat = fmt_config.get("compatible", "unknown")
if compat is True:
compatible.append(fmt_name)
elif compat is False:
incompatible.append(fmt_name)
else:
depends.append(fmt_name)
print(f"\n📊 格式统计:")
print(f" 总计: {len(VIDEO_FORMATS)} 个格式")
print(f" Mac兼容: {len(compatible)} 个")
print(f" Mac不兼容: {len(incompatible)} 个")
print(f" 取决于配置: {len(depends)} 个")
print(f"\n✅ Mac兼容格式 ({len(compatible)}个):")
for fmt in compatible:
desc = VIDEO_FORMATS[fmt].get("description", "")
print(f" • {fmt}: {desc}")
print(f"\n❌ Mac不兼容格式 ({len(incompatible)}个):")
for fmt in incompatible:
desc = VIDEO_FORMATS[fmt].get("description", "")
print(f" • {fmt}: {desc}")
print(f"\n⚠️ 配置依赖格式 ({len(depends)}个):")
for fmt in depends:
desc = VIDEO_FORMATS[fmt].get("description", "")
print(f" • {fmt}: {desc}")
# 检查yuv420p和yuv444p的使用
print(f"\n🎨 像素格式分析:")
yuv420_count = 0
yuv444_count = 0
for fmt_name, fmt_config in VIDEO_FORMATS.items():
main_pass = fmt_config.get("main_pass", [])
if "-pix_fmt" in main_pass:
idx = main_pass.index("-pix_fmt")
if idx + 1 < len(main_pass):
pix_fmt = main_pass[idx + 1]
if "420" in pix_fmt:
yuv420_count += 1
elif "444" in pix_fmt:
yuv444_count += 1
print(f" yuv420p格式: {yuv420_count} 个")
print(f" yuv444p格式: {yuv444_count} 个")
print(f" 可配置格式: {len(depends)} 个")
print("\n" + "="*60)
return True
except Exception as e:
print(f"❌ 生成报告失败: {e}")
return False
def main():
"""主函数"""
print("🔍 开始验证视频格式集成...\n")
results = []
# 1. 检查文件存在
results.append(("文件存在", check_file_exists()))
# 2. 检查语法
results.append(("Python语法", check_syntax()))
# 3. 检查VIDEO_FORMATS
results.append(("VIDEO_FORMATS", check_video_formats()))
# 4. 检查高级参数
results.append(("高级参数", check_advanced_parameters()))
# 5. 生成报告
results.append(("格式报告", generate_format_report()))
# 总结
print("\n" + "="*60)
print("验证总结")
print("="*60)
passed = sum(1 for _, r in results if r)
total = len(results)
for name, result in results:
icon = "✅" if result else "❌"
print(f" {icon} {name}")
print(f"\n通过: {passed}/{total}")
if passed == total:
print("\n🎉 所有检查通过!集成成功!")
return 0
else:
print(f"\n⚠️ 有 {total - passed} 个检查失败")
return 1
if __name__ == "__main__":
sys.exit(main())