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

在ffmpeg版本的飞速升级中,也给众流媒体开发者们带来坚实的瓶颈,最近做了一份仍使用ffmpeg4.0.2的libfaac实现pcm转aac编码器。据众道友反馈,光代码已经不能满足修炼需求,特奉上工程连接https://download.csdn.net/download/guhongzhanchi/10815554,误了众道友的修行,贫道在此特意声明,概不负责也,因为负不起也。众道友切莫欢喜过度,工程中可以编码成aac,但却出现了规律的“咔咔”声,因为各类因素的原因,我就没去深入解决,如有道友愿不吝赐教,贫道铭感五内!

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

fread()之前先初始化下

image.gif

SwrContext

image.gif

//格式转换: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; }

image.gif

然后在fread()之后和

avcodec_send_frame()之前

image.gif

swr_convert()

image.gif

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; }

image.gif

对此就可以编码了。

我这里出现了规律的"咔咔“杂音,有道友说是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);

image.gif

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

1 个赞