天天看点

ffmpeg4.0.2实现音频pcm转aac编码器

     在ffmpeg版本的飞速升级中,也给众流媒体开发者们带来坚实的瓶颈,最近做了一份仍使用ffmpeg4.0.2的libfaac实现pcm转aac编码器。据众道友反馈,光代码已经不能满足修炼需求,特奉上工程连接 https://download.csdn.net/download/guhongzhanchi/10815554

,误了众道友的修行,贫道在此特意声明,概不负责也,因为负不起也。众道友切莫欢喜过度,工程中可以编码成aac,但却出现了规律的“咔咔”声,因为各类因素的原因,我就没去深入解决,如有道友愿不吝赐教,贫道铭感五内!

    言归正传,其实就是在原有的编码流程上增加下音频重采样。在

fread()之前先初始化下      
ffmpeg4.0.2实现音频pcm转aac编码器
SwrContext      
ffmpeg4.0.2实现音频pcm转aac编码器
//格式转换:pcm(s16)转aac(fltp)
    //asfmt = aacc->sample_fmts;
    swr_ctx = swr_alloc_set_opts(nullptr, aacctx->channel_layout, aacctx->sample_fmt,aacctx->sample_rate,
                                 aacctx->channel_layout, psfmt, aacctx->sample_rate, 0, nullptr);
    if (swr_ctx == nullptr)
    {
        fprintf(stderr, "Could not allocate resample context!\n");
        return -1;
    }
    if (swr_init(swr_ctx) < 0)
    {
        fprintf(stderr, "Failed to initialize the resampling context!\n");
        return -1;
    }      
ffmpeg4.0.2实现音频pcm转aac编码器

然后在fread()之后和

avcodec_send_frame()之前      
ffmpeg4.0.2实现音频pcm转aac编码器
swr_convert()      
ffmpeg4.0.2实现音频pcm转aac编码器
if (swr_convert(swr_ctx, aacfr->extended_data, aacfr->nb_samples, (const uint8_t**)aacfr->data, aacfr->nb_samples) <= 0)
        {
            cout << "Audio swr_convert failed!" << endl;
            return -1;
        }      
ffmpeg4.0.2实现音频pcm转aac编码器

对此就可以编码了。

      我这里出现了规律的"咔咔“杂音,有道友说是aac的buffer小了,我增加了4倍依然没解决

aacSize = av_samples_get_buffer_size(NULL, aacctx->channels,aacctx->frame_size,aacctx->sample_fmt, 1);
    aacfrBuf = (uint8_t *)av_malloc(aacSize * 4);      
ffmpeg4.0.2实现音频pcm转aac编码器

也有道友说编码时帧跟不上。从数据上分析bug我也觉得这个原因很有可能,但后来在仔细检查重采样传参后发现参数传错了,修完这个bug就可以正常编码,只是目前不支持解码?各位要有见解,敬请留言。

继续阅读