为什么我在使用swresample 1.1时会得到FPE?

时间:2013-01-21 22:32:14

标签: android audio android-ndk ffmpeg

我正在构建一个项目,使用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项目中发现了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函数中的变量 a 。我逐步完成了代码,发现它来自变量 resampleCtx-&gt; postin 。此变量从 swr_init 函数中的 resampleCtx-&gt; 中复制,但我看不到中的设置为任何内容。

我做错了什么?是在我的代码中还是在swresample中存在问题?

1 个答案:

答案 0 :(得分:1)

这里的答案是我在输入中犯了一个错误。 swr_convert不支持AV_SAMPLE_FMT_S16,并且对swr_init的函数调用失败。我只是没有检查结果才知道这一点。