调用ffmpeg接口解码H264数据流,无法解码非关键帧

调用ffmpeg的avcodec_decode_video2接口解码H264数据帧,为什么只能解码关键帧,非关键帧都解码不到呢,代码如下:
AVCodec *codec;
AVPacket packet;
AVFrame *pFrame;
AVCodecContext *pcodec;

av_init_packet(&packet);
av_register_all();
codec = avcodec_find_decoder(AV_CODEC_ID_H264);

if(!codec)
{
fprintf(stderr, "Codec not found\n");
return 0;
}

pcodec = avcodec_alloc_context3(codec);
if (!pcodec) {
fprintf(stderr, "Could not allocate audio codec context\n");
return 0;
}

pcodec->extradata =(uint8_t *)malloc(51);
pcodec->extradata_size = 51;
memcpy(pcodec->extradata, sps,43);
memcpy(pcodec->extradata+43, pps,8);

if(avcodec_open2(pcodec, codec,NULL) >= 0)
pFrame = avcodec_alloc_frame();// Allocate video frame
else return -1;

int got_picture;

packet.data = pBuffer;//这里填入一个指向完整H264数据帧的指针
packet.size = dwBufsize;//这个填入H264数据帧的大小

//printf("size of packet=%d\n",sizeof(packet));
printf("packet->size=%d\n",packet.size);

int DecodeRet=avcodec_decode_video2(pcodec, pFrame, &got_picture, &packet);
if (DecodeRet < 0) {
printf("Decode Error.\n");
return DecodeRet;
}

2个回答

你这段代码八成在一个函数内,pFrame 需要一直保留,做成某个成员变量

robothn
robothn 但是这个 avcodec_decode_video2 的调用是会把临时数据写到 pFrame 内的,如果你函数每走一次都清掉 pFrame,那就只能遇到Key帧才能出一帧了
接近 4 年之前 回复
robothn
robothn 回复mjiarong: got_picture 返回值是0说明依据你传入的这些packet 数据还解不出有效帧
接近 4 年之前 回复
mjiarong
mjiarong 还有我想问下用avcodec_decode_video2(pcodec, pFrame, &got_picture, &packet);接口解码非关键帧,got_picture的返回值一直是0,这是解码成功还是失败?
接近 4 年之前 回复
mjiarong
mjiarong 前面那几个变量一开始是放在函数里面,但是后来放到外面好像还是不行
接近 4 年之前 回复

编解码配置一样吗,编码不要开B帧

DRACULAX05
DRACULAX05 找avcodec_decode_video2的源码看一下,信息更新了说明头没错,具体要看看代码是哪一步错误退出了
接近 4 年之前 回复
mjiarong
mjiarong 回复DRACULAX05: 但是pcodec中的一些字段信息好像更新了pcodec->width=1920 pcodec->height=1080 pcodec->codec_id=28 pcodec->flags=0 ,pcodec->time_base.den=60 pcodec->time_base.num=1 pcodec->frame_number=0 pcodec->bit_rate200000 pcodec->codec_type=0
接近 4 年之前 回复
mjiarong
mjiarong 回复DRACULAX05: 打印了一下解码后pFrame中的信息,发现确实没解到width=0 height=0 key_frame=1 format=-1 qualipBufferty=0 pict_type=0
接近 4 年之前 回复
DRACULAX05
DRACULAX05 回复mjiarong: got_picture=0说明没解出帧来,你可以查看一下错误信息
接近 4 年之前 回复
mjiarong
mjiarong 还有我想问下用avcodec_decode_video2(pcodec, pFrame, &got_picture, &packet);接口解码非关键帧,got_picture的返回值一直是0,这是解码成功还是失败?
接近 4 年之前 回复
mjiarong
mjiarong 没有B帧
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐