avcodec_open2 错误 -542398533:"Generic error in an external library"
avcodec_open2 error -542398533 : "Generic error in an external library"
我在尝试使用 avcodec_open2()
打开编解码器时遇到错误。如果我在 av_guess_format()
函数中指定 avi
而不是 h264
,我已经尝试了相同的代码而没有任何问题。
我不知道该怎么做。还有其他人遇到过类似的问题吗?
我使用的库是 ffmpeg-20160219-git-98a0053-win32-dev。如果您能帮助我摆脱这种困惑,我将不胜感激。
这是我的控制台输出:
Video encoding
[libx264 @ 01383460] broken ffmpeg default settings detected
[libx264 @ 01383460] use an encoding preset (e.g. -vpre medium)
[libx264 @ 01383460] preset usage: -vpre -vpre
[libx264 @ 01383460] speed presets are listed in x264 --help
[libx264 @ 01383460] profile is optional; x264 defaults to high
Cannot open video codec, -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;
}
你的问题是这一行:
codecCtx = pVideoStream->codec;
这个 AVCodecContext
是使用全局默认值分配的,x264 拒绝了,因为它们不是最优的。相反,使用 avcodec_alloc_context3
to allocate it, which will set x264-specific defaults. At the end of your encoding, don't forget to avcodec_free_context
返回的指针。
你应该将编解码器参数传递给 avformat_new_stream
codec = avcodec_find_encoder(codecCtx->codec_id);
pVideoStream = avformat_new_stream(pFormatCtx, codec);
我在尝试使用 avcodec_open2()
打开编解码器时遇到错误。如果我在 av_guess_format()
函数中指定 avi
而不是 h264
,我已经尝试了相同的代码而没有任何问题。
我不知道该怎么做。还有其他人遇到过类似的问题吗?
我使用的库是 ffmpeg-20160219-git-98a0053-win32-dev。如果您能帮助我摆脱这种困惑,我将不胜感激。
这是我的控制台输出:
Video encoding
[libx264 @ 01383460] broken ffmpeg default settings detected
[libx264 @ 01383460] use an encoding preset (e.g. -vpre medium)
[libx264 @ 01383460] preset usage: -vpre -vpre
[libx264 @ 01383460] speed presets are listed in x264 --help
[libx264 @ 01383460] profile is optional; x264 defaults to high
Cannot open video codec, -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;
}
你的问题是这一行:
codecCtx = pVideoStream->codec;
这个 AVCodecContext
是使用全局默认值分配的,x264 拒绝了,因为它们不是最优的。相反,使用 avcodec_alloc_context3
to allocate it, which will set x264-specific defaults. At the end of your encoding, don't forget to avcodec_free_context
返回的指针。
你应该将编解码器参数传递给 avformat_new_stream
codec = avcodec_find_encoder(codecCtx->codec_id);
pVideoStream = avformat_new_stream(pFormatCtx, codec);