fn extract_sound() -> Result<(), Box<dyn Error>> {
ffmpeg::init().unwrap();
let input_video = "C:/Users/lerne/Downloads/VID_20240308_121424_808.mp4";
let output_audio = "123.mp3";
let mut ictx = input(&Path::new(input_video))?;
let mut octx = Arc::new(Mutex::new(output(&Path::new(output_audio))?));
let input_stream = ictx.streams().best(Type::Audio).ok_or("No audio stream found")?;
let context = codec::context::Context::from_parameters(input_stream.parameters())?;
let mut decoder = context.decoder().audio().unwrap();
let codec = encoder::find(octx.lock().unwrap().format().codec(&Path::new(input_video), Type::Audio))
.expect("failed to find encoder")
.audio()?;
let mut binding = octx.lock().unwrap();
let mut output_stream = binding.add_stream(encoder::find(codec::Id::AAC))?;
let context = codec::context::Context::from_parameters(output_stream.parameters())?;
let mut encoder = context.encoder().audio().unwrap();
let channel_layout = codec
.channel_layouts()
.map(|cls| cls.best(decoder.channel_layout().channels()))
.unwrap_or(ffmpeg::channel_layout::ChannelLayout::STEREO);
#Extracting audio from video
2 messages · Page 1 of 1 (latest)
encoder.set_rate(decoder.rate() as i32);
encoder.set_channel_layout(channel_layout);
encoder.set_channels(channel_layout.channels());
encoder.set_format(
codec
.formats()
.expect("unknown supported formats")
.next()
.unwrap(),
);
encoder.set_bit_rate(decoder.bit_rate());
encoder.set_max_bit_rate(decoder.max_bit_rate());
encoder.set_time_base((1, decoder.rate() as i32));
output_stream.set_time_base((1, decoder.rate() as i32));
let in_time_base = output_stream.time_base();
println!("{}", in_time_base);
for (stream, mut packet) in ictx.packets() {
decoder.send_packet(&mut packet)?;
let mut frame = frame::Audio::empty();
while let Ok(..) = decoder.receive_frame(&mut frame) {
let mut encoded_packet = Packet::empty();
let timestamp = frame.timestamp();
println!("{:?}",timestamp);
frame.set_pts(timestamp);
encoder.send_frame(&frame)?;
encoder.receive_packet(&mut encoded_packet)?;
encoded_packet.set_stream(output_stream.index());
encoded_packet.rescale_ts(in_time_base,in_time_base);
{
let mut octx_borrowed = octx.lock().unwrap();
encoded_packet.write_interleaved(&mut octx_borrowed).unwrap();
}
}
}
Ok(())
}
cargo run
Compiling extract_sound v0.1.0 (C:\github\Video-sound-extractor\extract_sound)
Finished dev profile [unoptimized + debuginfo] target(s) in 0.75s
Running target\debug\extract_sound.exe
1/44100
[aac @ 000002895EEE7A00] Could not update timestamps for skipped samples.
Some(-64)