avcodec_open2错误-542398533:“外部库中的通用错误”

时间:2016-03-24 03:52:20

标签: c++ ffmpeg libavcodec

尝试使用avcodec_open2()打开编解码器时遇到错误。如果我在avi函数中指定h264而不是av_guess_format(),我已经尝试了相同的代码而没有任何问题。

我不知道该怎么做。有没有其他人遇到过类似的问题?

我正在使用的库是 ffmpeg-20160219-git-98a0053-win32-dev 。如果你能帮我解决这个困惑,我真的很感激。

这是我的控制台输出:

  

视频编码
   [libx264 @ 01383460]破了ffmpeg检测到的默认设置
   [libx264 @ 01383460]使用编码预设(例如-vpre medium)
   [libx264 @ 01383460]预设用法:-vpre -vpre
   [libx264 @ 01383460]速度预设列在x264 --help
中    [libx264 @ 01383460]个人资料是可选的; x264默认为高
   无法打开视频编解码器,-542398533

这是我正在使用的代码:

// Video encoding sample
AVCodec *codec = NULL;
AVCodecContext *codecCtx= NULL;
AVFormatContext *pFormatCtx = NULL;
AVOutputFormat *pOutFormat = NULL;
AVStream * pVideoStream = NULL;;
AVFrame *picture = NULL;;

int i, x, y, ret;

printf("Video encoding\n");

// Register all formats and codecs
av_register_all();

// guess format from file extension
pOutFormat = av_guess_format("h264", NULL, NULL);
if (NULL==pOutFormat){
    cerr << "Could not guess output format" << endl;
    return -1;
}   

// allocate context
pFormatCtx = avformat_alloc_context();
pFormatCtx->oformat = pOutFormat;
memcpy(pFormatCtx->filename,filename,
    min(strlen(filename), sizeof(pFormatCtx->filename)));

// Add stream to pFormatCtx
pVideoStream = avformat_new_stream(pFormatCtx, 0);
if (!pVideoStream) 
{
    printf("Cannot add new video stream\n");
    return -1;
}

// Set stream's codec context
codecCtx = pVideoStream->codec;
codecCtx->codec_id = (AVCodecID)pOutFormat->video_codec;
codecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
codecCtx->frame_number = 0;
// Put sample parameters.
codecCtx->bit_rate = 2000000;
// Resolution must be a multiple of two.
codecCtx->width  = 320;
codecCtx->height = 240;
codecCtx->time_base.den = 10;
codecCtx->time_base.num = 1;
pVideoStream->time_base.den = 10;
pVideoStream->time_base.num = 1;
codecCtx->gop_size = 12; // emit one intra frame every twelve frames at most
codecCtx->pix_fmt = AV_PIX_FMT_YUV420P;

if (codecCtx->codec_id == AV_CODEC_ID_H264)
{
    // Just for testing, we also add B frames 
    codecCtx->mb_decision = 2;
}
// Some formats want stream headers to be separate.
if(pFormatCtx->oformat->flags & AVFMT_GLOBALHEADER)
{
    codecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
}

if(codecCtx->codec_id == AV_CODEC_ID_H264)
    av_opt_set(codecCtx->priv_data, "preset", "slow", 0);


// Open the codec.
codec = avcodec_find_encoder(codecCtx->codec_id);
if (codec == NULL) {
    fprintf(stderr, "Codec not found\n");
    return -1;
}
ret = avcodec_open2(codecCtx, codec, NULL); // returns -542398533 here
if (ret < 0) 
{
    printf("Cannot open video codec, %d\n",ret);
    return -1;
}

2 个答案:

答案 0 :(得分:3)

你的问题就在这一行:

  

codecCtx = pVideoStream->codec;

AVCodecContext是使用全局默认值分配的,x264拒绝这些默认值,因为它们不是最佳的。而是使用avcodec_alloc_context3来分配它,这将设置特定于x264的默认值。在编码结束时,不要忘记avcodec_free_context返回的指针。

答案 1 :(得分:1)

你应该将编解码器参数传递给avformat_new_stream

    codec = avcodec_find_encoder(codecCtx->codec_id);
    pVideoStream = avformat_new_stream(pFormatCtx, codec);