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

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

avcodec_decode_audio4();

avcodec_encode_audio2();


调用上面两个函数出现的问题是:当某些解码器对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的大小,

分拆时要依据当前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的结构变量

你可能感兴趣的:(ffmpeg,-22)