2013-01-21 22 views
1

我正在構建一個項目,使用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中有問題?

回答

1

這裏的答案是我在輸入中犯了一個錯誤。 sw_convert不支持AV_SAMPLE_FMT_S16,並且對swr_init的函數調用失敗。我只是沒有檢查結果就知道這一點。

+0

我有同樣的問題。但是,我確實打電話給swrinit並使用AV_SAMPLE_FMT_S16P。儘管如此,我也遇到了同樣的問題。 – TheSHEEEP

相關問題