audio_replacement/
audio_replacement.rs1use std::process;
17
18use ff_remux::AudioReplacement;
19
20fn main() {
21 let mut args = std::env::args().skip(1);
22 let mut video = None::<String>;
23 let mut audio = None::<String>;
24 let mut output = None::<String>;
25
26 while let Some(flag) = args.next() {
27 match flag.as_str() {
28 "--video" | "-v" => video = Some(args.next().unwrap_or_default()),
29 "--audio" | "-a" => audio = Some(args.next().unwrap_or_default()),
30 "--output" | "-o" => output = Some(args.next().unwrap_or_default()),
31 other => {
32 eprintln!("Unknown flag: {other}");
33 process::exit(1);
34 }
35 }
36 }
37
38 let video = video.unwrap_or_else(|| {
39 eprintln!("Usage: audio_replacement --video <file> --audio <file> --output <file>");
40 process::exit(1);
41 });
42 let audio = audio.unwrap_or_else(|| {
43 eprintln!("--audio is required");
44 process::exit(1);
45 });
46 let output = output.unwrap_or_else(|| {
47 eprintln!("--output is required");
48 process::exit(1);
49 });
50
51 println!("Video source: {video}");
52 println!("Audio source: {audio}");
53 println!("Output: {output}");
54 println!();
55 println!("Replacing audio track (stream-copy, no re-encode)…");
56
57 AudioReplacement::new(&video, &audio, &output)
58 .run()
59 .unwrap_or_else(|e| {
60 eprintln!("Error: {e}");
61 process::exit(1);
62 });
63
64 let size = match std::fs::metadata(&output) {
65 Ok(m) => {
66 #[allow(clippy::cast_precision_loss)]
67 let kb = m.len() as f64 / 1024.0;
68 if kb < 1024.0 {
69 format!("{kb:.0} KB")
70 } else {
71 format!("{:.1} MB", kb / 1024.0)
72 }
73 }
74 Err(_) => "(unknown size)".to_string(),
75 };
76
77 println!("Done. {output} {size}");
78}