我正在構建一個項目,使用FFmpeg 1.1在Android中查看來自IP攝像機的視頻源。爲什麼我在使用swresample 1.1時獲得FPE?
我試圖在Android項目中使用swresample並在調用swr_convert時獲得浮點異常。我步進swresample代碼,並找到libswresample/swresample.c中的一行函數swri_realloc_audio其中變量a-> bps和a-> ch_count爲零導致FPE。
int swri_realloc_audio(AudioData *a, int count){
int i, countb;
AudioData old;
LOGD("in swri_realloc_audio - bps[%d], ch_count[%d]", a->bps, a->ch_count);
if(count < 0 || count > INT_MAX/2/a->bps/a->ch_count)
return AVERROR(EINVAL);
01-21 17:29:09.612:d/swresample.c(18789):在swri_realloc_audio - BPS [0],ch_count [0]
我在FFmpeg項目聲音發現bug ticket #1834像完全相同的問題,但通過調用swr_init解決。但是,我的代碼確實調用了這個函數,但仍然崩潰。這裏是我的JNI代碼:
SwrContext* resampleCtx = swr_alloc_set_opts(NULL,
AV_CH_LAYOUT_MONO, AV_SAMPLE_FMT_S16, pAudioCodecCtx->sample_rate,
pAudioCodecCtx->channel_layout, pAudioCodecCtx->sample_fmt,
pAudioCodecCtx->sample_rate, 0, 0);
swr_init(resampleCtx);
LOGD("Resample context initialized");
int dataSize = swr_convert(resampleCtx,
&pAudioOutBuffer, AVCODEC_MAX_AUDIO_FRAME_SIZE/2,
(const uint8_t**) &(pFrame->data[0]), pFrame->nb_samples);
LOGD("Resample conversion complete");
swr_free(&resampleCtx);
LOGD("Obtained data size - dataSize[%d]", dataSize);
我很困惑,因爲我似乎並不有超過在swri_realloc_audio函數變量一個任何控制。我瀏覽了代碼,發現它來自變量resampleCtx-> postin。這個變量是從resampleCtx->中swr_init函數複製的,但是我看不到在哪裏都設置爲任何東西。
我在做什麼錯?它是在我的代碼中還是在swresample中有問題?
我有同樣的問題。但是,我確實打電話給swrinit並使用AV_SAMPLE_FMT_S16P。儘管如此,我也遇到了同樣的問題。 – TheSHEEEP