use tvai_sdk::TvaiSdk; use std::fs; fn main() -> Result<(), Box> { println!("🔍 详细 FFmpeg 命令分析"); println!("========================\n"); let sdk = TvaiSdk::new(); // 读取并分析 4x 慢动作模板 let template_content = fs::read_to_string("template/4x slow motion.json")?; let template: tvai_sdk::Template = serde_json::from_str(&template_content)?; println!("📋 模板信息:"); println!(" 名称: {}", template.name); println!(" 描述: {}", template.description); println!(); // 生成基本命令 let basic_command = sdk.generate_ffmpeg_command(&template, "input.mp4", "output.mp4")?; println!("🔧 基本 FFmpeg 命令:"); println!("{}\n", basic_command); // 详细分析命令结构 analyze_command_structure(&basic_command); // 测试不同的输入输出组合 println!("\n📊 不同场景测试:"); let test_cases = [ ("30fps_video.mp4", "30fps_to_120fps.mp4", "30fps → 120fps (4x慢动作)"), ("60fps_video.mp4", "60fps_to_240fps.mp4", "60fps → 240fps (4x慢动作)"), ("24fps_film.mov", "24fps_to_96fps.mov", "24fps → 96fps (电影素材)"), ("sports_1080p.mp4", "sports_slowmo_4k.mp4", "体育视频慢动作"), ]; for (input, output, description) in &test_cases { println!("\n 📹 {}", description); match sdk.generate_ffmpeg_command(&template, input, output) { Ok(cmd) => { println!(" ✓ 命令生成成功"); analyze_specific_aspects(&cmd, &template); }, Err(e) => println!(" ✗ 命令生成失败: {}", e), } } // 测试硬件加速版本 println!("\n🚀 硬件加速测试:"); test_hardware_acceleration(&sdk, &template); // 分析潜在问题 println!("\n⚠️ 潜在问题分析:"); analyze_potential_issues(&basic_command, &template); // 提供优化建议 println!("\n💡 优化建议:"); provide_optimization_suggestions(&template); Ok(()) } fn analyze_command_structure(command: &str) { println!("🏗️ 命令结构分析:"); let parts: Vec<&str> = command.split_whitespace().collect(); println!(" 总参数数: {}", parts.len()); // 分析各个部分 let mut i = 0; while i < parts.len() { match parts[i] { "ffmpeg" => println!(" [{}] 可执行文件: {}", i, parts[i]), "-i" => { if i + 1 < parts.len() { println!(" [{}] 输入文件: {}", i, parts[i + 1]); i += 1; } }, "-vf" => { if i + 1 < parts.len() { println!(" [{}] 视频滤镜: {}", i, parts[i + 1]); analyze_video_filter(parts[i + 1]); i += 1; } }, "-c:v" => { if i + 1 < parts.len() { println!(" [{}] 视频编码器: {}", i, parts[i + 1]); i += 1; } }, "-c:a" => { if i + 1 < parts.len() { println!(" [{}] 音频编码器: {}", i, parts[i + 1]); i += 1; } }, "-crf" => { if i + 1 < parts.len() { println!(" [{}] 视频质量 (CRF): {}", i, parts[i + 1]); i += 1; } }, "-preset" => { if i + 1 < parts.len() { println!(" [{}] 编码预设: {}", i, parts[i + 1]); i += 1; } }, "-b:a" => { if i + 1 < parts.len() { println!(" [{}] 音频比特率: {}", i, parts[i + 1]); i += 1; } }, _ => { if parts[i].starts_with('"') && parts[i].ends_with('"') { println!(" [{}] 输出文件: {}", i, parts[i]); } } } i += 1; } } fn analyze_video_filter(filter: &str) { println!(" 🎛️ 滤镜详细分析:"); // 移除引号 let filter = filter.trim_matches('"'); if filter.contains("tvai_fi") { println!(" 类型: TVAI 帧插值滤镜"); // 解析参数 if let Some(params_part) = filter.split("tvai_fi=").nth(1) { let params: Vec<&str> = params_part.split(':').collect(); for param in params { if param.starts_with("model=") { let model = ¶m[6..]; println!(" 模型: {} ({})", model, get_model_description(model)); } else if param.starts_with("slowmo=") { let factor = ¶m[7..]; println!(" 慢动作倍数: {}x", factor); } else if param.starts_with("rdt=") { let threshold = ¶m[4..]; println!(" 重复帧检测阈值: {}", threshold); } else if param.starts_with("fps=") { let fps = ¶m[4..]; println!(" 目标帧率: {} fps", fps); } } } } } fn get_model_description(model: &str) -> &'static str { match model { "chr-2" => "Chronos v2 - 通用帧插值模型", "apo-8" => "Apollo v8 - 高质量帧插值模型", "chf-3" => "Chronos Fast v3 - 快速帧插值模型", _ => "未知模型", } } fn analyze_specific_aspects(command: &str, template: &tvai_sdk::Template) { // 检查帧率处理 if !command.contains("fps=") && template.settings.output.out_fps == 0.0 { println!(" ⚠️ 未指定输出帧率,将依赖输入帧率 × 慢动作倍数"); } // 检查质量设置 if command.contains("-crf 23") { println!(" ✓ 使用中等质量设置 (CRF 23)"); } // 检查编码器选择 if command.contains("libx264") { println!(" ℹ️ 使用软件 H.264 编码器 (兼容性好,速度较慢)"); } // 检查音频处理 if command.contains("-c:a aac") { println!(" ✓ 使用 AAC 音频编码器 (广泛兼容)"); } } fn test_hardware_acceleration(sdk: &TvaiSdk, template: &tvai_sdk::Template) { let hw_tests = [ ("windows", Some("nvidia"), "NVIDIA GPU"), ("osx", Some("appleIntel"), "Apple VideoToolbox"), ("windows", Some("amd"), "AMD GPU"), ]; for (os, gpu, desc) in &hw_tests { match sdk.ffmpeg_generator.generate_with_auto_encoder(template, "input.mp4", "output.mp4", os, *gpu) { Ok(cmd) => { println!(" ✓ {} 硬件加速:", desc); if cmd.contains("nvenc") { println!(" 使用 NVIDIA NVENC 编码器"); } else if cmd.contains("videotoolbox") { println!(" 使用 Apple VideoToolbox 编码器"); } else if cmd.contains("amf") { println!(" 使用 AMD AMF 编码器"); } }, Err(e) => println!(" ✗ {} 硬件加速失败: {}", desc, e), } } } fn analyze_potential_issues(command: &str, template: &tvai_sdk::Template) { let mut issues: Vec<&str> = Vec::new(); let mut warnings: Vec<&str> = Vec::new(); // 检查帧率问题 if template.settings.slow_motion.factor == 4.0 && !command.contains("fps=") { warnings.push("4倍慢动作但未明确指定输出帧率,可能导致帧率不符合预期"); } // 检查存储空间问题 if template.settings.slow_motion.factor >= 4.0 { warnings.push("4倍慢动作会显著增加文件大小,请确保有足够存储空间"); } // 检查性能问题 if command.contains("libx264") && !command.contains("preset fast") { warnings.push("使用软件编码器且未设置快速预设,编码时间可能较长"); } // 检查兼容性问题 if !command.contains("-pix_fmt") { warnings.push("未明确指定像素格式,可能在某些播放器上出现兼容性问题"); } // 输出结果 if issues.is_empty() && warnings.is_empty() { println!(" ✅ 未发现明显问题"); } else { for issue in issues { println!(" ❌ 问题: {}", issue); } for warning in warnings { println!(" ⚠️ 警告: {}", warning); } } } fn provide_optimization_suggestions(template: &tvai_sdk::Template) { println!(" 🎯 针对 4倍慢动作的优化建议:"); println!(" 1. 帧率设置:"); println!(" - 建议明确设置输出帧率,如 30fps → 120fps"); println!(" - 避免过高的输出帧率以减少文件大小"); println!(" 2. 编码器选择:"); println!(" - 优先使用硬件编码器 (NVENC/VideoToolbox/AMF) 提升速度"); println!(" - 考虑使用 H.265 编码器减少文件大小"); println!(" 3. 质量设置:"); println!(" - 慢动作视频建议使用较高质量 (CRF 18-20)"); println!(" - 可以适当降低音频比特率节省空间"); println!(" 4. 性能优化:"); println!(" - 使用 SSD 存储提升 I/O 性能"); println!(" - 确保有足够内存处理高帧率视频"); if template.settings.slow_motion.duplicate { println!(" 5. 重复帧处理:"); println!(" - 当前启用重复帧检测,有助于提升质量"); println!(" - 阈值设置为 {} (推荐范围: 5-15)", template.settings.slow_motion.duplicate_threshold); } }