解決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的結構變量 編譯

相關文章
相關標籤/搜索