[FFmpeg-user] using libav to resample, alias effects

Jieyun Fu jieyunfu at gmail.com
Thu Apr 21 00:35:28 CEST 2011


Hi all,

I realized that when I am writing my own code to upsample a piece of audio
from 8000Hz to 22050Hz, I always get some alias effects: the sound got buzzy
(with some zee, zee in the background) and looking at the spectrogram we can
see the frequency mirrors around 8K Hz, which is a classical alias effects.

If I use ffmpeg binaries, I don't have this problem. But I do need to use
Libav to achieve that. You guys can download the original raw waveform and
the converted raw waveform from (
http://dl.dropbox.com/u/4363247/ffmpeg/before.raw and
http://dl.dropbox.com/u/4363247/ffmpeg/after.raw)

There are two APIs to resample the audio but both produce these alias
effects. Please let me know if I am missing anything.

    newsize = (long) size * 22050 / 8000.0;
    ReSampleContext* context = av_audio_resample_init(1, 1, // out channels,
in channels
                                     22050, 8000,
                                     SAMPLE_FMT_S16, SAMPLE_FMT_S16,
                                     16, 0, 0, 0.8);
    int audio_resample_rc = audio_resample(context,
(short*)converted_samples, (short*)samples, size / 2);
    if (context)
        audio_resample_close(context);

and

        int out_rate = 22050;
        audio_cntx = av_resample_init( out_rate,    // out rate
            RATE,   // in rate
            16, // filter length
            0,  // phase count
            0,  // linear FIR filter
            0.8 );  // cutoff frequency
        assert( audio_cntx && "Failed to create resampling context!" );

        int samples_consumed = 0;
        int samples_output = av_resample( audio_cntx,
            (short*)out_buffer,
            (short*)in_buffer,
            &samples_consumed,
            bytes_read / 2,
            40000 * 4 / 2,
            0 );
        av_resample_close( audio_cntx );

Jieyun


More information about the ffmpeg-user mailing list