簡體   English   中英

為什么只有樣本數不同時,avcodec_fill_audio_frame會返回-22?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM