下午好,
我得到了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 _...
,都会发生故障答案 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
)。