use ez_ffmpeg::{FfmpegContext, Output};
use std::collections::HashMap;
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
let example_name = args.get(1).map(|s| s.as_str()).unwrap_or("basic");
match example_name {
"basic" => basic_metadata(),
"stream" => stream_metadata(),
"copy" => copy_metadata(),
"remove" => remove_metadata(),
"complete" => complete_workflow(),
_ => {
println!("Available examples:");
println!(" basic - Add global metadata");
println!(" stream - Add stream-specific metadata");
println!(" copy - Copy metadata from input");
println!(" remove - Remove/disable metadata copying");
println!(" complete - Comprehensive workflow");
println!("\nUsage: cargo run --example metadata [example_name]");
}
}
}
fn basic_metadata() {
println!("=== Basic Global Metadata Example ===\n");
let output = Output::from("output.mp4")
.add_metadata("title", "My Video")
.add_metadata("author", "John Doe")
.add_metadata("comment", "Created with ez-ffmpeg")
.add_metadata("year", "2024");
FfmpegContext::builder()
.input("input.mp4")
.output(output)
.build()
.unwrap()
.start()
.unwrap()
.wait()
.unwrap();
println!("Video processed with metadata successfully!");
println!("Use 'ffprobe -show_format output.mp4' to verify metadata\n");
}
fn stream_metadata() {
println!("=== Stream-Specific Metadata Example ===\n");
let output = Output::from("output.mp4")
.add_stream_metadata("v:0", "language", "eng")
.unwrap()
.add_stream_metadata("v:0", "title", "Main Video")
.unwrap()
.add_stream_metadata("a:0", "language", "eng")
.unwrap()
.add_stream_metadata("a:0", "title", "English Audio")
.unwrap()
.add_stream_metadata("s", "language", "eng")
.unwrap();
FfmpegContext::builder()
.input("input.mp4")
.output(output)
.build()
.unwrap()
.start()
.unwrap()
.wait()
.unwrap();
println!("Video processed with stream metadata successfully!");
println!("Use 'ffprobe -show_streams output.mp4' to verify stream metadata\n");
}
fn copy_metadata() {
println!("=== Copy Metadata Example ===\n");
let output = Output::from("output.mp4")
.map_metadata_from_input(0, "g", "g")
.unwrap()
.map_metadata_from_input(0, "s:v:0", "s:v:0")
.unwrap()
.add_metadata("encoder", "ez-ffmpeg");
FfmpegContext::builder()
.input("input.mp4")
.output(output)
.build()
.unwrap()
.start()
.unwrap()
.wait()
.unwrap();
println!("Video processed with copied metadata successfully!");
println!("Use 'ffprobe -show_format -show_streams output.mp4' to verify metadata\n");
}
fn remove_metadata() {
println!("=== Remove/Disable Metadata Example ===\n");
let output = Output::from("output.mp4")
.disable_auto_copy_metadata()
.add_metadata("title", "New Title")
.add_metadata("author", "New Author");
FfmpegContext::builder()
.input("input.mp4")
.output(output)
.build()
.unwrap()
.start()
.unwrap()
.wait()
.unwrap();
println!("Video processed without auto-copied metadata!");
println!("Use 'ffprobe -show_format output.mp4' to verify only new metadata exists\n");
}
fn complete_workflow() {
println!("=== Complete Metadata Workflow Example ===\n");
let mut global_metadata = HashMap::new();
global_metadata.insert("title".to_string(), "Complete Example".to_string());
global_metadata.insert("artist".to_string(), "ez-ffmpeg".to_string());
global_metadata.insert("album".to_string(), "Examples Collection".to_string());
global_metadata.insert("year".to_string(), "2024".to_string());
global_metadata.insert("genre".to_string(), "Educational".to_string());
global_metadata.insert("copyright".to_string(), "MIT License".to_string());
let output = Output::from("output.mp4")
.add_metadata_map(global_metadata)
.add_metadata("encoder", "ez-ffmpeg metadata example")
.add_metadata(
"comment",
"This video demonstrates complete metadata workflow",
)
.add_stream_metadata("v:0", "language", "eng")
.unwrap()
.add_stream_metadata("v:0", "title", "HD Video Track")
.unwrap()
.add_stream_metadata("v:0", "handler_name", "VideoHandler")
.unwrap()
.add_stream_metadata("a:0", "language", "eng")
.unwrap()
.add_stream_metadata("a:0", "title", "Stereo Audio Track")
.unwrap()
.add_stream_metadata("a:0", "handler_name", "AudioHandler")
.unwrap()
.map_metadata_from_input(0, "s:v:0", "s:v:0")
.unwrap()
.set_video_codec("libx264")
.set_video_codec_opt("preset", "medium")
.set_video_codec_opt("crf", "23")
.set_audio_codec("aac")
.set_audio_codec_opt("b", "192k");
FfmpegContext::builder()
.input("input.mp4")
.output(output)
.build()
.unwrap()
.start()
.unwrap()
.wait()
.unwrap();
println!("Video processed with complete metadata workflow!");
println!("\nVerify the metadata:");
println!(" Global: ffprobe -show_format output.mp4");
println!(" Streams: ffprobe -show_streams output.mp4");
println!(" All: ffprobe -show_format -show_streams output.mp4\n");
}