mixvideo-v2/cargos/tvai-v2/examples/detailed_ffmpeg_analysis.rs

275 lines
9.7 KiB
Rust
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use tvai_sdk::TvaiSdk;
use std::fs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
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 = &param[6..];
println!(" 模型: {} ({})", model, get_model_description(model));
} else if param.starts_with("slowmo=") {
let factor = &param[7..];
println!(" 慢动作倍数: {}x", factor);
} else if param.starts_with("rdt=") {
let threshold = &param[4..];
println!(" 重复帧检测阈值: {}", threshold);
} else if param.starts_with("fps=") {
let fps = &param[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);
}
}