avcodec_open分段错误

时间:2014-06-24 18:16:34

标签: c++ ffmpeg ubuntu-12.04 libavcodec

下午好,

我得到了ffmpeg的api-example.c(https://www.ffmpeg.org/doxygen/0.6/api-example_8c-source.html)的副本。我测试了函数video_encode_example()并使代码按预期工作。

然后我将此函数重新分解为不同的类方法,现在我通过调用avcodev_open()得到了一个seg错误。然后我更改了代码以从类方法调用原始video_encode_example()并且对avcodec的调用成功。

似乎从函数调用时(例如video_encode_example()),行为是预期的,但是当从类方法调用时avcodev_open失败。我跟踪了代码,在这两种情况下,avcodev_open()参数的值都被赋予(和类似的)指针值。 cgdb报告在avcodev_open2()

中发生了seg错误

有什么建议吗? 使用可通过apt-get(libavcodec.so.53.35.0)获得的libav包在Ubuntu 12.04 64位机器上编译和测试代码

此致 丹尼尔

在第一次回复后添加评论:

从上面的链接中,我复制了函数video_encode_example()并将调用放在类构造函数中。这部分正在运作。

VideoEncoder::VideoEncoder( const std::string& aFileName)
    : mCodec( NULL)
    , mCodecContext( NULL)
    , picture (NULL)
    , mFileName( aFileName)
    , mFileHandler( NULL)
{
    // must be called before using avcodec lib
    ::avcodec_init();

    // register all the codecs
    ::avcodec_register_all();

    video_encode_example( aFileName.c_str());
    return;
    ...
}

重新分解的部分包括将avcodev调用(从原始video_encode_example()函数)拆分为不同的VideoEncoder方法。构造函数现在看起来像:

VideoEncoder::VideoEncoder( const std::string& aFileName)
    : mCodec( NULL)
    , mCodecContext( NULL)
    , picture (NULL)
    , mFileName( aFileName)
    , mFileHandler( NULL)
{
    // must be called before using avcodec lib
    ::avcodec_init();

    // register all the codecs
    ::avcodec_register_all();

    // find the mpeg1 video encoder
    mCodec = ::avcodec_find_encoder( CODEC_ID_MPEG1VIDEO);
    if (!mCodec) {
        fprintf( stderr, "codec not found\n");
        exit( 1);
    }

    mCodecContext = ::avcodec_alloc_context3( mCodec);
    picture = ::avcodec_alloc_frame();

    // put sample parameters
    mCodecContext->bit_rate = 400000;

    // frames per second
    mCodecContext->time_base = (AVRational){1,25};
    mCodecContext->gop_size = 10;               // emit one intra frame every ten frames
    mCodecContext->max_b_frames = 1;
    mCodecContext->pix_fmt = PIX_FMT_YUV420P;

    // open it
    // Initializes the AVCodecContext to use the given AVCodec. Prior to using this function the context has to be allocated.
    if (::avcodec_open( mCodecContext, mCodec) < 0) {
        fprintf(stderr, "could not open codec\n");
        exit( 1);
    }

    mFileHandler = fopen( mFileName.c_str(), "wb");
    if (!mFileHandler) {
        fprintf( stderr, "could not open %s\n", mFileName.c_str());
        exit( 1);
    }

}

调用avcodec_open会导致seg错误。此外,无论是使用avcodev_ ..还是:: avcodev _...

,都会发生故障

1 个答案:

答案 0 :(得分:0)

您的代码未设置.width的{​​{1}} / .height成员,这会导致以后崩溃。

Ubuntu 12.04附带版本0.8中的mCodecContext分叉ffmpeg,与libav 1.0+甚至更晚ffmpeg版本IIRC更兼容。我假设您正在使用该存储库版本,并且在测试过程中使用了ffmpeg(尽管我个人非常喜欢真正的 libav-0.8.12,这是ffmpeg那一刻)。

有趣的是,使用ffmpeg-2.2(使用ffmpeg-2.2)代替av_codec_open2不会崩溃,而是通常会返回失败并打印关于宽度和高度未设置的警告(另一个指向libav-0.8而不是ffmpeg)。