feat: add template json
This commit is contained in:
183
cargos/tvai-v2/examples/ffmpeg_generation.rs
Normal file
183
cargos/tvai-v2/examples/ffmpeg_generation.rs
Normal file
@@ -0,0 +1,183 @@
|
||||
use tvai_sdk::*;
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
println!("Topaz Video AI SDK - FFmpeg Command Generation Example");
|
||||
println!("=====================================================");
|
||||
|
||||
let sdk = TvaiSdk::new();
|
||||
|
||||
// Example 1: Basic FFmpeg command generation
|
||||
println!("\n1. Basic FFmpeg command generation:");
|
||||
|
||||
let upscale_template = TemplatePresets::upscale_to_4k()?;
|
||||
let basic_command = sdk.generate_ffmpeg_command(&upscale_template, "input.mp4", "output_4k.mp4")?;
|
||||
|
||||
println!(" Template: {}", upscale_template.name);
|
||||
println!(" Command: {}", basic_command);
|
||||
|
||||
// Example 2: Hardware acceleration commands
|
||||
println!("\n2. Hardware acceleration commands:");
|
||||
|
||||
// NVIDIA GPU acceleration
|
||||
let nvidia_command = sdk.generate_ffmpeg_command_with_gpu(&upscale_template, "input.mp4", "output_nvidia.mp4", "0")?;
|
||||
println!(" NVIDIA GPU (device 0):");
|
||||
println!(" {}", nvidia_command);
|
||||
|
||||
// Multi-GPU setup
|
||||
let multi_gpu_command = sdk.generate_ffmpeg_command_with_gpu(&upscale_template, "input.mp4", "output_multi_gpu.mp4", "0.1")?;
|
||||
println!("\n Multi-GPU (devices 0 and 1):");
|
||||
println!(" {}", multi_gpu_command);
|
||||
|
||||
// Example 3: Different codec configurations
|
||||
println!("\n3. Different codec configurations:");
|
||||
|
||||
// H.264 with NVENC
|
||||
let h264_nvenc = sdk.generate_ffmpeg_command_with_codec(&upscale_template, "input.mp4", "output_h264_nvenc.mp4", "h264_nvenc", Some(20))?;
|
||||
println!(" H.264 NVENC (CQ 20):");
|
||||
println!(" {}", h264_nvenc);
|
||||
|
||||
// H.265 with NVENC
|
||||
let h265_nvenc = sdk.generate_ffmpeg_command_with_codec(&upscale_template, "input.mp4", "output_h265_nvenc.mp4", "hevc_nvenc", Some(22))?;
|
||||
println!("\n H.265 NVENC (CQ 22):");
|
||||
println!(" {}", h265_nvenc);
|
||||
|
||||
// AMD AMF H.264
|
||||
let h264_amf = sdk.generate_ffmpeg_command_with_codec(&upscale_template, "input.mp4", "output_h264_amf.mp4", "h264_amf", Some(25))?;
|
||||
println!("\n H.264 AMF (QP 25):");
|
||||
println!(" {}", h264_amf);
|
||||
|
||||
// Intel QSV H.264
|
||||
let h264_qsv = sdk.generate_ffmpeg_command_with_codec(&upscale_template, "input.mp4", "output_h264_qsv.mp4", "h264_qsv", Some(23))?;
|
||||
println!("\n H.264 QSV (Global Quality 23):");
|
||||
println!(" {}", h264_qsv);
|
||||
|
||||
// Example 4: Different template types
|
||||
println!("\n4. Commands for different template types:");
|
||||
|
||||
// Frame interpolation
|
||||
let fps_template = TemplatePresets::convert_to_60fps()?;
|
||||
let fps_command = sdk.generate_ffmpeg_command(&fps_template, "input_30fps.mp4", "output_60fps.mp4")?;
|
||||
println!(" Frame interpolation (60 FPS):");
|
||||
println!(" {}", fps_command);
|
||||
|
||||
// Noise removal
|
||||
let denoise_template = TemplatePresets::remove_noise()?;
|
||||
let denoise_command = sdk.generate_ffmpeg_command(&denoise_template, "noisy_input.mp4", "clean_output.mp4")?;
|
||||
println!("\n Noise removal:");
|
||||
println!(" {}", denoise_command);
|
||||
|
||||
// Video stabilization
|
||||
let stabilize_template = TemplatePresets::stabilize_video()?;
|
||||
let stabilize_command = sdk.generate_ffmpeg_command(&stabilize_template, "shaky_input.mp4", "stable_output.mp4")?;
|
||||
println!("\n Video stabilization:");
|
||||
println!(" {}", stabilize_command);
|
||||
|
||||
// Slow motion
|
||||
let slowmo_template = TemplatePresets::slow_motion_4x()?;
|
||||
let slowmo_command = sdk.generate_ffmpeg_command(&slowmo_template, "normal_speed.mp4", "slow_motion.mp4")?;
|
||||
println!("\n 4x Slow motion:");
|
||||
println!(" {}", slowmo_command);
|
||||
|
||||
// Example 5: Complex custom template
|
||||
println!("\n5. Complex custom template:");
|
||||
|
||||
let complex_template = TemplateBuilder::new("Professional Enhancement")
|
||||
.description("Professional video enhancement with multiple effects")
|
||||
.enable_enhancement("prob-4")
|
||||
.enhancement_params(30, 40, 20) // denoise=30, detail=40, sharpen=20
|
||||
.enable_stabilization(75, 1) // high stabilization, full frame
|
||||
.enable_frame_interpolation("chf-3", 1.0)
|
||||
.output_settings(7, 60.0) // 4K at 60fps
|
||||
.build()?;
|
||||
|
||||
let complex_command = sdk.generate_ffmpeg_command(&complex_template, "input_professional.mp4", "output_professional.mp4")?;
|
||||
println!(" Complex template command:");
|
||||
println!(" {}", complex_command);
|
||||
|
||||
// Example 6: Batch processing commands
|
||||
println!("\n6. Batch processing commands:");
|
||||
|
||||
let input_files = vec![
|
||||
"project/clip1.mp4".to_string(),
|
||||
"project/clip2.mp4".to_string(),
|
||||
"project/clip3.mp4".to_string(),
|
||||
"project/clip4.mp4".to_string(),
|
||||
"project/clip5.mp4".to_string(),
|
||||
];
|
||||
|
||||
let batch_commands = sdk.generate_batch_commands(&upscale_template, &input_files, "project/output")?;
|
||||
|
||||
println!(" Generated {} batch commands:", batch_commands.len());
|
||||
for (i, command) in batch_commands.iter().enumerate() {
|
||||
println!(" Batch {}: {}", i + 1, command);
|
||||
}
|
||||
|
||||
// Example 7: Using FFmpeg command builder for advanced scenarios
|
||||
println!("\n7. Advanced FFmpeg command builder:");
|
||||
|
||||
// Create a custom command with multiple filters
|
||||
let advanced_command = FfmpegCommandBuilder::new("input_advanced.mp4", "output_advanced.mp4")
|
||||
.add_filter("tvai_up=model=ahq-12:scale=2:noise=0.3:details=0.2")
|
||||
.add_filter("tvai_fi=model=chr-2:fps=60")
|
||||
.add_filter("tvai_stb=model=ref-2:smoothness=8")
|
||||
.codec("hevc_nvenc")
|
||||
.quality(18)
|
||||
.hardware_accel("cuda")
|
||||
.custom_param("-preset slow")
|
||||
.custom_param("-profile:v main10")
|
||||
.build();
|
||||
|
||||
println!(" Advanced custom command:");
|
||||
println!(" {}", advanced_command);
|
||||
|
||||
// Create a command for HDR content
|
||||
let hdr_command = FfmpegCommandBuilder::new("input_hdr.mp4", "output_hdr.mp4")
|
||||
.add_filter("tvai_up=model=hyp-1:scale=2:sdr_ip=0.65:hdr_ip_adjust=0.3:saturate=0.8")
|
||||
.codec("hevc_nvenc")
|
||||
.quality(16)
|
||||
.custom_param("-color_primaries bt2020")
|
||||
.custom_param("-color_trc smpte2084")
|
||||
.custom_param("-colorspace bt2020nc")
|
||||
.build();
|
||||
|
||||
println!("\n HDR processing command:");
|
||||
println!(" {}", hdr_command);
|
||||
|
||||
// Example 8: Template validation for FFmpeg
|
||||
println!("\n8. Template validation for FFmpeg generation:");
|
||||
|
||||
let templates_to_validate = vec![
|
||||
TemplatePresets::upscale_to_4k()?,
|
||||
TemplatePresets::convert_to_60fps()?,
|
||||
TemplatePresets::remove_noise()?,
|
||||
TemplatePresets::stabilize_video()?,
|
||||
TemplatePresets::slow_motion_4x()?,
|
||||
];
|
||||
|
||||
for template in &templates_to_validate {
|
||||
match sdk.validate_template_for_ffmpeg(template) {
|
||||
Ok(()) => println!(" ✅ '{}' is valid for FFmpeg generation", template.name),
|
||||
Err(e) => println!(" ❌ '{}' validation failed: {}", template.name, e),
|
||||
}
|
||||
}
|
||||
|
||||
// Example 9: Performance optimization suggestions
|
||||
println!("\n9. Performance optimization suggestions:");
|
||||
|
||||
println!(" For best performance:");
|
||||
println!(" - Use GPU acceleration when available (device=0, device=0.1, etc.)");
|
||||
println!(" - Choose appropriate codec based on your hardware:");
|
||||
println!(" • NVIDIA: h264_nvenc, hevc_nvenc");
|
||||
println!(" • AMD: h264_amf, hevc_amf");
|
||||
println!(" • Intel: h264_qsv, hevc_qsv");
|
||||
println!(" - Adjust quality settings based on content:");
|
||||
println!(" • High quality: CQ/CRF 16-20");
|
||||
println!(" • Balanced: CQ/CRF 20-25");
|
||||
println!(" • Fast encoding: CQ/CRF 25-30");
|
||||
println!(" - Use multiple instances for parallel processing on high-end GPUs");
|
||||
println!(" - Consider VRAM usage with vram parameter (0.5-0.8 for shared systems)");
|
||||
|
||||
println!("\n✅ FFmpeg command generation example completed successfully!");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user