#Extracting audio from video

2 messages · Page 1 of 1 (latest)

scenic walrus
#
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);



#


    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)