1

FFmpeg 1.1を使用して、AndroidのIPカメラからのビデオフィードを表示するプロジェクトを構築しています。

Androidプロジェクトでswersampleを使用しようとしていますが、swr_convertを呼び出すと浮動小数点例外が発生します。swresampleコードをステップ実行し、libswresample / swresample.c関数swri_realloc_audioで、変数a->bpsおよびa->ch_countがゼロでFPEを引き起こしている1行を見つけました。

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がどこに設定されているかわかりません。

私は何が間違っているのですか?それは私のコードにありますか、それともswesampleに問題がありますか?

4

1 に答える 1

1

ここでの答えは、入力を間違えたということです。AV_SAMPLE_FMT_S16はswr_convertでサポートされておらず、swr_initへの関数呼び出しが失敗していました。私はこれを知るために結果をチェックしていませんでした。

于 2013-01-24T02:00:40.523 に答える