【问题标题】:Why am I getting FPE when using swresample 1.1?为什么在使用 swresample 1.1 时会出现 FPE?
【发布时间】:2013-01-05 02:01:54
【问题描述】:

我正在构建一个项目以使用 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->postin。此变量是从 swr_init 函数中的 resampleCtx->in 复制的,但我看不到 in 的任何设置位置。

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

【问题讨论】:

    标签: android audio android-ndk ffmpeg


    【解决方案1】:

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

    【讨论】:

    • 我也有同样的问题。但是,我确实调用了 swrinit 并使用了 AV_SAMPLE_FMT_S16P。尽管如此,我还是遇到了同样的崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多