我需要知道是否可以在无需先解码的情况下找到 I 帧。我希望在 AVPacket 中有一些标志,但我看不到有一个。
谢谢。
您当然可以通过查找适当的标头代码来找到 I 帧的位置。如果您解析序列,您可以从起始代码中找到它。
H.264 比特流被分成称为 NAL 单元的部分。这些单元前面有 24 位代码 0x000001 用于同步。在此之后,将有一个唯一的开始代码,对应于图片的开始,以及图片的类型,您可以根据它来决定这是哪一帧。
是的,您可以从 AVPacket 获取关键帧,此结构“标志”中有一个成员。您可以通过 pkt.flags 获取该值,对于 Key-frame,该值将为 1,否则为 0。
如果您只需要知道哪个数据包是 I 帧,只需检查AVPacket::flags
.
if(packet->flag & AV_PKT_FLAG_KEY) {
// this is I-frame
}
如果要检测 P 或 B 帧,请使用AVPacket::side_data
.
for (int i = 0; i < pkt->side_data_elems; i++) {
if (pkt->side_data[i].type == AVPacketSideDataType::AV_PKT_DATA_QUALITY_STATS) {
AVPictureType frameType = (AVPictureType)pkt->side_data[i].data[4];
// 1: I-frame, 2: P-frame, 3: B-frame
}
}
它适用于 libx264。