Profile and Level

小编初学,好多东西还没明白,先记录一下,以后再来详细补充。
Profile和Level指定了一致性点,这些一致性点提供了标准应用程序中的编码器和解码器实现之间以及具有类似功能需求的各种应用程序之间的互操作性。一个Profile定义了一组用于的语法特性生成符合标准的位流,而level对位流的某些关键参数进行限制,例如最大比特率。所有的解码器形成一个特定的配置文件和水平必须支持端口包含在该配置文件时为级别指定的约束。编码器不需要有效的使用配置文件中支持的特定功能集和级别,但不能违反语法特性设置和关联的约束。这意味着在特别是符合任何特定的profile文件和level,尽管它确保了互操作性用解码器,不提供任何保证端到端复制质量。图6说明了目前H.264/的六个概要文件MPEG4-AVC及其相应的主要功能图,如下所示。
在这里插入图片描述
其中字符串流指定了语法元素profile_idc和level_idc的特定值。Profile是用来描述视频压缩特性的,profile越高,就说明采用了越高级的压缩特性

1. Profile

在H.264/MPEG4-AVC的第一个版本中有三个概要文件被定义:Baseline,Extended和Main profiles。Baseline profile支持H.264/MPEG4-AVC, v. 1 (2003),
除了以下三个特性:

  • B片,野外图片编码,场编码帧和场编码之间的宏块自适应切换(MBAFF),并加权预测。
  • CABAC。
  • SP和SI切片,以及切片分割。
1.1 Baseline Profile
  • 仅支持I P Slice types
  • 仅支持CAVLC熵编码
  • 环路滤波
  • 仅支持无交错的视频格式

profile_idc being equal to 66

1.2 Constrained Baseline profile

比特流与Baseline Profile的一致性由profile_idc等于66,并且constraint_set1_flag等于1来表示。
符合特定level的Baseline Profile的解码器应能够解码以下所有都正确的所有位流:

  • profile_idc等于66或constraint_set0_flag等于1
  • constraint_set1_flag等于1
  • level_idc和constraint_set3_flag表示小于或等于指定level
1.3 Main profile
  • 兼容Baseline profile
  • 仅支持I P B
  • CABAC+CAVLC熵编码
  • 加权预测

比特流与Main Profile的一致性由profile_idc等于77表示。
符合指定level的Main Profile的解码器应能够解码其中profile_idc等于77或constraint_set1_flag等于1,且level_idc和constraint_set3_flag代表小于或等于指定level的所有位流。

1.4 Extended profile
  • 仅支持CAVLC熵编码
  • 支持 I P B SP SI
  • 序列参数集的direct_8x8_inference_flag应等于1

比特流与Extended Profile的一致性由profile_idc等于88表示。
符合指定level的Extended Profile的解码器应能够解码其中profile_idc等于88或constraint_set2_flag等于1且level_idc代表小于或等于指定level的所有位流。
符合指定级别的Extended Profile的解码器也应能够解码profile_idc等于66或constraint_set0_flag等于1的所有位流,其中level_idc和constraint_set3_flag代表小于或等于指定level。

1.5 High profile
  • 兼容Main Profile
  • 仅支持I P B
  • 不允许使用任意的切片顺序

比特流适应于High Profile表示为profile_idc等于100。符合特定级别的Hogh profile的解码器应能够解码符合以下条件之一或两个条件的所有位流:

  • (profile_idc等于77或constraint_set1_flag等于1),level_idc和constraint_set3_flag的组合表示小于或等于指定level
  • profile_idc等于100,level_idc表示小于或等于指定level

2. Level

Level是对视频本身特性的描述(码率、分辨率、fps),Level越高,视频的码率、分辨率、fps越高,而level主要是对码流的关键参数的取值范围作了限定,与解码器的处理能力和存储能力相关联。
在这里插入图片描述

Reference:1.The H.264/MPEG4 Advanced Video Coding Standard and its Applications
2.H.264-Advanced video coding for generic audiovisual services

要从 H.264 数据流中获取 profile 信息,您需要使用 `GstH264Parser` 元素来解析 H.264 数据流,并使用 `GstH264NalUnitType` 枚举类型来获取 NAL 单元类型。具体来说,您可以执行以下步骤: 1. 在管道中添加 `GstH264Parser` 元素。例如: ```c GstElement *parser = gst_element_factory_make("h264parse", NULL); ``` 2. 从 H.264 数据流中分离 NAL 单元。您可以使用 `GstH264Parser` 元素的 `sink` pad 来输入 H.264 数据流,并使用 `src` pad 来获取分离的 NAL 单元数据。例如: ```c GstPad *parser_sink = gst_element_get_static_pad(parser, "sink"); GstPad *parser_src = gst_element_get_static_pad(parser, "src"); gst_pad_link(pad, parser_sink); ``` 请注意,`pad` 变量是包含 H.264 数据流的 pad。 3. 在 `src` pad 上添加一个 probe,以便在分离的 NAL 单元中查找 SPS(Sequence Parameter Set)和 PPS(Picture Parameter Set)。例如: ```c static GstPadProbeReturn probe_callback(GstPad *pad, GstPadProbeInfo *info, gpointer user_data) { GstBuffer *buf = GST_BUFFER(info->data); GstMapInfo map; if (gst_buffer_map(buf, &map, GST_MAP_READ)) { GstH264NalUnitType type = gst_h264_nal_unit_type(map.data[0] & 0x1F); if (type == GST_H264_NAL_SPS) { // Found SPS // Parse profile information from SPS } else if (type == GST_H264_NAL_PPS) { // Found PPS // Parse profile information from PPS } gst_buffer_unmap(buf, &map); } return GST_PAD_PROBE_OK; } GstPad *parser_src = gst_element_get_static_pad(parser, "src"); gst_pad_add_probe(parser_src, GST_PAD_PROBE_TYPE_BUFFER, probe_callback, NULL, NULL); ``` 在这个例子中,我们使用 `gst_pad_add_probe()` 函数在 `src` pad 上安装一个 probe。当分离出的 NAL 单元传递到 `src` pad 时,我们将在 `probe_callback()` 回调函数中收到通知,并使用 `gst_h264_nal_unit_type()` 函数获取 NAL 单元类型。如果我们找到了 SPS 或 PPS,我们可以从中解析出 profile 信息。注意,SPS 和 PPS 在 H.264 数据流中通常是以特定的顺序出现的,因此您需要确保在找到 SPS 后正确地解析 PPS。 4. 解析 SPS 中的 profile 信息。SPS 包含有关视频序列的信息,包括 profilelevel、分辨率等。要从 SPS 中获取 profile 信息,您需要解析 SPS 中包含的 `profile_idc` 和 `constraint_setN_flag`。例如: ```c // Parse profile_idc and constraint_setN_flag from SPS uint8_t profile_idc = map.data[1]; uint8_t constraint_setN_flag = map.data[2] & 0x1F; if (profile_idc == 100) { // High profile if (constraint_setN_flag & 0x04) { // Constraint set 4 is supported } } else if (profile_idc == 110) { // High 10 profile // ... } else if (profile_idc == 122) { // High 4:2:2 profile // ... } else if (profile_idc == 244) { // High 4:4:4 profile // ... } ``` 在这个例子中,我们使用 `map.data[1]` 获取 `profile_idc`,使用 `map.data[2]` 获取 `constraint_setN_flag`。根据 H.264 标准,您可以使用这些值来确定视频序列的 profile 信息。 请注意,这只是从 H.264 数据流中获取 profile 信息的一种方法。实现可能因使用的 H.264 编码器和其他因素而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值