[英]Why does avcodec_fill_audio_frame return -22 when only sample count is different?
我的問題很快得到解釋:我必須使用FFmpeg(原始PCM到G.711 mu-law)對音頻樣本進行編碼。 這是我的代碼的罪魁禍首部分(在此示例中,我將原始參數明確表示出來):
AVFrame* frame = av_frame_alloc();
frame->nb_samples = 8000;
frame->format = AV_SAMPLE_FMT_S16;
frame->channels = 1;
frame->channel_layout = AV_CH_LAYOUT_MONO;
frame->sample_rate = 8000;
frame->quality = 1;
int res = avcodec_fill_audio_frame(frame, 1, AV_SAMPLE_FMT_S16, /*my samples data*/, 16000, 0);
// If res >= 0, continue with avcodec_encode_audio2
它的工作原理是:) ...好吧,我的意思是...
當我輸入的是8000個音頻樣本( S16格式,即16000字節)時,它可以工作。 但是,當我有6000個音頻樣本(仍為S16格式,因此為12000字節)時,它失敗並顯示-22(無效參數)。 任何想法?
精度:此樣本計數不會動態變化。 我的會話中的數據總是由8000個樣本組成(並且有效),而其他會話中的數據總是由6000個樣本組成(並且失敗)。 樣本數量和數據大小是這些會話之間唯一不同的參數。
編輯:如果我設置或不frame_size
現場AVCodecContext
,它返回到0后avcodec_open2
但選擇μ律編碼器具有AV_CODEC_CAP_VARIABLE_FRAME_SIZE
能力,所以它聽起來正常。
每次對avcodec_encode_audio2()
調用的輸入應恰好是N個樣本,其中N是AVCodecContext::frame_size
。 在某些情況下,這取決於編解碼器(例如,mp3幀大小是恆定的),但在其他情況下,它可以是可變的。 對於大多數編碼器,它在編碼中仍應保持恆定。 看起來您的值就是默認值,並且mulaw沒有內置常量,因此您可以在調用avcodec_open2()
之前指定一個不同的frame_size
值,您應該可以。
如果樣本數量動態變化,則需要一個環形緩沖區以確保avcodec_encode_audio2()
的輸入仍具有恆定的樣本數量。
好的,我解決了自己的問題,這是對齊問題。 有兩種解決方法:
給輸入緩沖區初始化並根據libavcodec
所需的默認對齊方式填充。 您可以使用av_samples_get_buffer_size
並將對齊值設置為0,以獲取正確的大小。
在對齊參數為1的情況下調用avcodec_fill_audio_frame
以忽略對齊。
希望這會幫助別人:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.