新增功能: - 添加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>
262 lines
7.6 KiB
Python
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())
|