我正在构建一个项目以使用 FFmpeg 1.1 在 Android 中查看来自 IP 摄像机的视频源。
我正在尝试在 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 项目中发现了错误单 #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 函数中的变量a。我逐步浏览了代码并注意到它来自变量resampleCtx->postin。此变量是从swr_init函数中的resampleCtx- >in复制的,但我看不到in设置为任何内容。
我究竟做错了什么?是在我的代码中还是在 swresample 中存在问题?