解决avcodec_encode_audio2()返回-22的问题

2:使用2012.8.31日编译的库  编码mp3 函数

avcodec_decode_audio4(); 编码

avcodec_encode_audio2(); code


调用上面两个函数出现的问题是:当某些解码器对AVCodec:frame_size填充时,不一样解码器在解码时设定的frame_size 和AVFrame::nb_samples过大,从而致使在编码的时出错。对于MP3编码器来讲,该编码器最大能支持1152(该值能够再源码中lsf     = sample_rate < (24000+32000)/2和该函数mp_decode_frame中获得,该函数位于libavcodec/mpegaudiodec)的帧数(这里的帧数实际就是样本大小,但不是采样大小,只是AVframe里面的样本数) 源码


解决方法:将解码获得的AVFrame  进行分拆,将其nb_samples分拆成当前编码器能支持最大的frame_size或小于frame_size的大小, io

分拆时要依据当前AVFrame::nb_samples的大小,该值与解压后的数据大小是这样的关系AVFrame::linesize[0] = AVFrame::nb_samples*2*AVCodecContext::channals;(该2表示每样本的字节数:16/8),根据这个关系,咱们此时能够将AVFrame::data[0] 的数据分拆成若干个AVFrame, 分拆后新的AVFrmae除了linesize,data,nb_sampels 改变,其他不用改,用原来AVFrame的值,赋予新的AVFrame的结构变量 编译

相关文章
相关标签/搜索