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不返回错误并avcodec_is_open返回 1,所以我假设codecContext已正确设置。我认为这是错误的吗?

当我avcodec_close立即调用时,我在 avcodec-54.dll 的某处收到访问冲突异常(写入 badf00d - 但我认为 avcodec_open2 处理了所有编解码器字段的填写)

人们在尝试调用未打开的编解码器时似乎遇到了分段错误avcodec_close,但我认为情况并非如此。

任何想法我做错了什么?

编辑:我应该提到我继承了这段代码,它使用的是相当旧的 ffmpeg 版本,并且这个问题只在我更新到最新的 ffmpeg tarball 时出现

4

1 回答 1

2

我用这个例子重写了这个类output_example.c,它似乎神奇地解决了这个问题。

av_set_parameters在进一步调查中,问题似乎是 和 的av_write_header顺序avcodec_open2。以前版本的 ffmpeg 似乎并不关心avcodec_open之后调用的内容,av_set_parameters但实际上并没有填写最新版本中的所有编解码器字段,除非它首先被调用

于 2013-02-19T22:28:56.440 回答