如何将重采样的数据扔给编码器(AVAudioFifo)

14 篇文章 1 订阅
9 篇文章 0 订阅

上一篇文件中写了一段重采样的测试代码,也提到过如何将resample的音频数据扔给编码器的方法,经过验证发现,该方法的确可行(我测试的音频为AAC格式,32bit,其它格式大家需要稍作改动)。

首先需创建AVAudioFifo *fifo并为它申请空间:

int FFmpegDecoder::InitAudioFifo()
{
    fifo = av_audio_fifo_alloc(AV_SAMPLE_FMT_FLTP, cp.ap.channel, 1);
    if(!fifo)
    {
        cout << "Could not allocate fifo" << endl;
        return -1;
    }
    return 0;
}

这里仅为fifo申请了一个字节,因为后面会对fifo重新申请内存,所以此处的大小不用关心

创建好fifo后,resamples后的数据存到该fifo中,调用如下函数:

int FFmpegDecoder::FeedingSamples2Fifo(uint8_t **data, const int data_size)
{
    int ret;
    ret = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) + data_size);
    if(ret < 0)
    {
        cout << "av_audio_fifo realloc failed" << endl;
        return ret;
    }

    if(av_audio_fifo_write(fifo, (void **)data, data_size) < data_size)
    {
        cout << "Could not write data to fifo" << endl;
        return AVERROR_EXIT;
    }
    return 0;
}
存储到fifo后,我们需要判断该fifo中是否有一帧数据,如果有,则从fifo中取出,也有可能fifo中含有多帧,所以从fifo中取出数据的时候,需要用到while循环。在取出fifo中的数据前,同样需要先申请一帧音频帧的空间:

AVFrame *FFmpegDecoder::AllocAudioFrame()
{
    AVFrame *frame = av_frame_alloc();
    if(!frame)
    {
        cout << "Could not allocate frame" << endl;
        return NULL;
    }

    frame->nb_samples = 1024;
    frame->channels = cp.ap.channel;
    frame->channel_layout = av_get_default_channel_layout(cp.ap.channel);
    frame->format = AV_SAMPLE_FMT_FLTP;
    frame->sample_rate = cp.ap.samplerate;

    av_frame_get_buffer(frame, 0);
    return frame;
}
申请好空间后,需要开始从fifo中读取音频数据了


while(av_audio_fifo_size > 1024)
{
    AVFrame *f = AllocAudioFrame();
    av_audio_fifo_read(fifo,(void**)f->data,1024);
}
为什么是1024?这个是AAC的nb_samples长度,其它音频格式可能又不一样了,这方面的知识我就不介绍了,好了,代码至此,已经贴完了。



评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值