1

ffmpegでavcodec_closeはどのように呼び出されることになっていますか?

これは私の問題を再現する最も単純なコードです:

bool CDataSequenceFormat::openVideoCodec( AVStream* videoStream )
{
    AVCodecContext* codecContext = videoStream->codec;

    AVCodec* codec = avcodec_find_encoder(codecContext->codec_id);

    if (codec == NULL || avcodec_open2(codecContext, codec, NULL) < 0 || avcodec_is_open(codecContext)==0)
    {
        return false;
    }

    avcodec_close(codecContext);

    return true;
}

avcodec_open2エラーを返さず、 1を返すので、が正しく設定されているavcodec_is_openと想定しています。codecContext私はこれを仮定するのは間違っていますか?

直後に呼び出すとavcodec_close、avcodec-54.dllのどこかでアクセス違反の例外(badf00dへの書き込み-しかし、avcodec_open2がすべてのコーデックフィールドの入力を処理したと思いました)が発生します

開いていないコーデックを呼び出そうとすると、セグメンテーション違反が発生しているようですがavcodec_close、ここではそうではないと思います。

私が間違っていることについて何か考えはありますか?

編集:私はかなり古いバージョンのffmpegを使用していたこのコードを継承し、この問題は最新のffmpegtarballに更新したときにのみ発生したことを言及する必要がありました

4

1 に答える 1

2

例を使用してクラスを書き直しましたoutput_example.cが、魔法のように問題が解決したようです。

さらに調べてみると、問題は、、の順序だったようav_set_parametersです。以前のバージョンのffmpegは、後で呼び出されたことを気にかけていなかったようですが、最初に呼び出されない限り、最新リリースのすべてのコーデックフィールドに実際に入力されるわけではありません。av_write_headeravcodec_open2avcodec_openav_set_parameters

于 2013-02-19T22:28:56.440 に答える