pub struct AudioReplacement { /* private fields */ }Expand description
Replace a video file’s audio track with audio from a separate source file.
The video bitstream is copied bit-for-bit (no decode/encode cycle). The
audio track from audio_input replaces any existing audio in
video_input.
Returns RemuxError::OperationFailed when no audio stream is found
in audio_input, or no video stream is found in video_input.
§Example
ⓘ
use ff_remux::AudioReplacement;
AudioReplacement::new("source.mp4", "new_audio.aac", "output.mp4").run()?;Implementations§
Source§impl AudioReplacement
impl AudioReplacement
Sourcepub fn new(
video_input: impl Into<PathBuf>,
audio_input: impl Into<PathBuf>,
output: impl Into<PathBuf>,
) -> Self
pub fn new( video_input: impl Into<PathBuf>, audio_input: impl Into<PathBuf>, output: impl Into<PathBuf>, ) -> Self
Create a new AudioReplacement.
video_input— source file whose video stream is kept.audio_input— source file whose first audio stream is used.output— path for the combined output file.
Examples found in repository?
examples/audio_replacement.rs (line 57)
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}Sourcepub fn run(self) -> Result<(), RemuxError>
pub fn run(self) -> Result<(), RemuxError>
Execute the audio replacement operation.
§Errors
RemuxError::OperationFailedifvideo_inputhas no video stream oraudio_inputhas no audio stream.RemuxError::Ffmpegif anyFFmpegAPI call fails.
Examples found in repository?
examples/audio_replacement.rs (line 58)
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}Auto Trait Implementations§
impl Freeze for AudioReplacement
impl RefUnwindSafe for AudioReplacement
impl Send for AudioReplacement
impl Sync for AudioReplacement
impl Unpin for AudioReplacement
impl UnsafeUnpin for AudioReplacement
impl UnwindSafe for AudioReplacement
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more