ffmpeg 判断关键帧

当mp4的profile为high的时候,avpacket==1并不能判断是否是关键帧,很多不是的也被误判断成关键帧了,具体做法应该是,进一步判断字节:

int is_keyframe_h264(AVPacket* pkt) {
// printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
// pkt->data[0], pkt->data[1], pkt->data[2], pkt->data[3], pkt->data[4],
// pkt->data[5], pkt->data[6], pkt->data[7], pkt->data[8], pkt->data[9]);
int length = 0;
unsigned char* p_buffer = pkt->data;
int i_buffer = pkt->size;
if ( (pkt->data[0] == 0 && pkt->data[1] == 0 && pkt->data[2] == 0 && pkt->data[3] == 1) ||
(pkt->data[0] == 0 && pkt->data[1] == 0 && pkt->data[2] == 1) ) {
while (i_buffer > 3) {
if (pkt->data[0] == 0 && pkt->data[1] == 0 && pkt->data[2] == 0 && pkt->data[3] == 1) {
p_buffer += 4;
i_buffer -= 4;
int nal_type = p_buffer[0] & 0x1f;
// printf("1 pkt.size %d length %d nal_type %d\n", pkt->size, length, nal_type);
if (nal_type == 5) return 1;
}
if (pkt->data[0] == 0 && pkt->data[1] == 0 && pkt->data[2] == 1) {
p_buffer += 3;
i_buffer -= 3;
int nal_type = p_buffer[0] & 0x1f;
// printf("2 pkt.size %d length %d nal_type %d\n", pkt->size, length, nal_type);
if (nal_type == 5) return 1;
}
p_buffer++;
i_buffer--;
}
} else {
while (i_buffer > 4) {
unsigned char* p = (unsigned char*)&length;
p[3] = p_buffer[0];
p[2] = p_buffer[1];
p[1] = p_buffer[2];
p[0] = p_buffer[3];
p_buffer += 4;
i_buffer -= 4;
int nal_type = p_buffer[0] & 0x1f;
//printf("3 p_buffer[0] 0x%02x pkt.size %d length %d nal_type %d\n", p_buffer[0], pkt->size, length, nal_type);
//if (nal_type == 5) return 1;
return 1;
p_buffer += length;
i_buffer -= length;
}
}
// printf("this h264 frame is not keyframe\n");
return 0;
}

int is_keyframe(AVCodec *dec, AVPacket* pkt) {
if (dec && dec->name) {
int cpylen = strlen((const char*)dec->name);
if (cpylen >= 4) {
if (0 == memcmp(dec->name, "h264", 4)) {
return is_keyframe_h264(pkt);
}
}
}
return 1;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值