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

227 lines
6.9 KiB
Rust

//! FFmpeg Command Generation Demo
//!
//! This example demonstrates how to generate FFmpeg commands
//! from Topaz Video AI templates for various processing scenarios.
use tvai::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("=== FFmpeg Command Generation Demo ===\n");
// Get template manager
let manager = global_topaz_templates().lock().unwrap();
// Demo 1: Basic command generation
println!("1. Basic Command Generation:");
match manager.quick_ffmpeg_command(
"upscale_to_4k",
"input.mp4",
"output_4k.mp4"
) {
Ok(cmd) => {
println!("Template: upscale_to_4k");
println!("Command: {}", cmd);
}
Err(e) => println!("Error: {}", e),
}
println!();
// Demo 2: GPU-specific commands
println!("2. GPU-Specific Commands:");
// NVIDIA GPU
match manager.gpu_ffmpeg_command(
"convert_to_60fps",
"input.mp4",
"output_60fps.mp4",
"nvidia"
) {
Ok(cmd) => {
println!("NVIDIA GPU Command:");
println!("{}", cmd);
}
Err(e) => println!("NVIDIA Error: {}", e),
}
println!();
// AMD GPU
match manager.gpu_ffmpeg_command(
"remove_noise",
"noisy_input.mp4",
"clean_output.mp4",
"amd"
) {
Ok(cmd) => {
println!("AMD GPU Command:");
println!("{}", cmd);
}
Err(e) => println!("AMD Error: {}", e),
}
println!();
// Demo 3: CPU processing
println!("3. CPU Processing Command:");
match manager.cpu_ffmpeg_command(
"4x_slow_motion",
"action.mp4",
"slow_motion.mp4"
) {
Ok(cmd) => {
println!("CPU Command:");
println!("{}", cmd);
}
Err(e) => println!("CPU Error: {}", e),
}
println!();
// Demo 4: Custom quality settings
println!("4. Custom Quality Commands:");
// High quality (CRF 15, slow preset)
match manager.quality_ffmpeg_command(
"film_stock_4k_strong",
"film_input.mp4",
"film_output_hq.mp4",
15,
"slow"
) {
Ok(cmd) => {
println!("High Quality Command (CRF 15, slow preset):");
println!("{}", cmd);
}
Err(e) => println!("High Quality Error: {}", e),
}
println!();
// Fast encoding (CRF 23, fast preset)
match manager.quality_ffmpeg_command(
"upscale_to_4k",
"input.mp4",
"output_fast.mp4",
23,
"fast"
) {
Ok(cmd) => {
println!("Fast Encoding Command (CRF 23, fast preset):");
println!("{}", cmd);
}
Err(e) => println!("Fast Encoding Error: {}", e),
}
println!();
// Demo 5: Custom options
println!("5. Custom Options:");
let custom_options = FfmpegCommandOptions::default()
.with_crf(20)
.with_preset("medium")
.with_video_codec("libx264")
.with_audio_codec("aac")
.with_custom_args(vec!["-movflags".to_string(), "+faststart".to_string()]);
match manager.generate_ffmpeg_command(
"auto_crop_stabilization",
"shaky_input.mp4",
"stable_output.mp4",
Some(&custom_options)
) {
Ok(cmd) => {
println!("Custom Options Command:");
println!("{}", cmd);
}
Err(e) => println!("Custom Options Error: {}", e),
}
println!();
// Demo 6: Batch processing commands
println!("6. Batch Processing Commands:");
let input_output_pairs = vec![
("video1.mp4".to_string(), "enhanced1.mp4".to_string()),
("video2.mp4".to_string(), "enhanced2.mp4".to_string()),
("video3.mp4".to_string(), "enhanced3.mp4".to_string()),
];
match manager.batch_ffmpeg_commands(
"upscale_to_4k",
&input_output_pairs,
None
) {
Ok(commands) => {
println!("Batch Commands for upscale_to_4k:");
for (i, cmd) in commands.iter().enumerate() {
println!(" {}. {}", i + 1, cmd);
}
}
Err(e) => println!("Batch Error: {}", e),
}
println!();
// Demo 7: Different templates showcase
println!("7. Different Templates Showcase:");
let templates_to_demo = [
("upscale_to_4k", "input.mp4", "output_4k.mp4"),
("convert_to_60fps", "input.mp4", "output_60fps.mp4"),
("remove_noise", "noisy.mp4", "clean.mp4"),
("4x_slow_motion", "action.mp4", "slow.mp4"),
("auto_crop_stabilization", "shaky.mp4", "stable.mp4"),
];
for (template, input, output) in &templates_to_demo {
match manager.quick_ffmpeg_command(template, input, output) {
Ok(cmd) => {
// Get template info directly from manager to avoid deadlock
if let Some(template_obj) = manager.get_template(template) {
println!("Template: {} ({})", template_obj.name, template);
println!("Description: {}", template_obj.description);
println!("Command: {}", cmd);
println!();
}
}
Err(e) => println!("Error with template {}: {}", template, e),
}
}
drop(manager); // Release lock
// Demo 8: Command options comparison
println!("8. Command Options Comparison:");
println!("CPU vs GPU vs Custom options for the same template:\n");
let manager = global_topaz_templates().lock().unwrap();
// CPU
if let Ok(cpu_cmd) = manager.cpu_ffmpeg_command("upscale_to_4k", "input.mp4", "output_cpu.mp4") {
println!("CPU Command:");
println!("{}\n", cpu_cmd);
}
// NVIDIA GPU
if let Ok(gpu_cmd) = manager.gpu_ffmpeg_command("upscale_to_4k", "input.mp4", "output_gpu.mp4", "nvidia") {
println!("NVIDIA GPU Command:");
println!("{}\n", gpu_cmd);
}
// Custom high-quality
let hq_options = FfmpegCommandOptions::nvidia().with_crf(12).with_preset("slow");
if let Ok(hq_cmd) = manager.generate_ffmpeg_command("upscale_to_4k", "input.mp4", "output_hq.mp4", Some(&hq_options)) {
println!("High Quality NVIDIA Command:");
println!("{}\n", hq_cmd);
}
drop(manager);
println!("=== Usage Tips ===");
println!("• Use quick_ffmpeg_command() for simple cases");
println!("• Use gpu_ffmpeg_command() to specify GPU type");
println!("• Use cpu_ffmpeg_command() for CPU-only processing");
println!("• Use quality_ffmpeg_command() for custom quality settings");
println!("• Use generate_ffmpeg_command() for full customization");
println!("• Use batch_ffmpeg_commands() for multiple files");
println!();
println!("=== Command Generation Complete ===");
println!("You can now copy and run these FFmpeg commands directly!");
println!("Note: Actual Topaz Video AI filters may require the Topaz FFmpeg plugin.");
Ok(())
}