在ffmpeg版本的维护中,也给FFmpeg Programer带来更坚实的瓶颈,我们做了一类基于ffmpeg4.的pcm转aac编码器。因为不全贴代码,先提供项目链接https://download.csdn.net/download/guhongzhanchi/10815554,在编码成aac后,出现了规律的“咔咔”声,我试了下音频重采样。在
fread()之前先初始化下
SwrContext
//格式转换: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; }
然后在fread()之后和
avcodec_send_frame()之前
swr_convert()
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; }
对此就可以编码了。
我这里出现了规律的"咔咔“杂音,社区里有朋友说是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);
也有朋友说编码时帧跟不上,从数据上分析bug我也觉得这个原因很有可能。而且这样编码后的AAC不支持原编码协议的解码,有朋友说ffmpeg4只支持硬编,根据当时的行业动态,我觉得有道理,大家有什么见解,欢迎留言。