3

我需要知道是否可以在无需先解码的情况下找到 I 帧。我希望在 AVPacket 中有一些标志,但我看不到有一个。

谢谢。

4

3 回答 3

3

您当然可以通过查找适当的标头代码来找到 I 帧的位置。如果您解析序列,您可以从起始代码中找到它。

H.264 比特流被分成称为 NAL 单元的部分。这些单元前面有 24 位代码 0x000001 用于同步。在此之后,将有一个唯一的开始代码,对应于图片的开始,以及图片的类型,您可以根据它来决定这是哪一帧。

于 2012-01-22T15:00:52.340 回答
1

是的,您可以从 AVPacket 获取关键帧,此结构“标志”中有一个成员。您可以通过 pkt.flags 获取该值,对于 Key-frame,该值将为 1,否则为 0。

于 2015-11-16T06:45:30.003 回答
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。

于 2022-03-02T05:51:15.733 回答