获取H264videostream的尺寸

我正在尝试从H264stream获取尺寸(高度和宽度)。 我知道要从mpeg2stream中获取相同的细节,您必须查看序列头开始代码((01B3))之后的四个字节。 H264的逻辑是否一样? 将不胜感激任何帮助,我得到..

没有!!!

您必须运行复杂的function从序列参数集中提取video尺寸。 如何做到这一点? 那么首先你必须编写你自己的Exp-Golomb解码器,或者在网上find一个…在live555源代码的地方有一个例如…

那么你必须得到一个SPS框架。 它具有NAL=0x67 (NAL是H.264帧中的第一个字节),你可以在SDP下的sprop-parameter-setsfind它作为Base64编码的stringsprop-parameter-sets在第一个逗号之前sprop-parameter-sets它的第一个Base64string。 其他逗号分隔的string有图片参数集…这是SDP的一个SPS Z0KAKYiLQDIBL0IAAB1MAAK/IAg=您需要从Base64解码类似的东西到一个字节数组。

然后你必须提取在该字节数组中的NAL UNIT HEADER后面的RAW BYTE SEQUENCE PAYLOAD ! 它通常是一个字节长,但只是为了确保阅读… RBSP包含运行seq_parameter_set_data( )函数所需的字节。 所以你需要先剥离NAL UNIT HEADER(一个或多个字节)。

这里是从SPS NAL UNIT中提取RBSP字节的函数:

NAL UNIT

然后当你有SPS(RBSP字节)时,你需要执行一个函数来分析这个字节数组中的位。 这里是parsing所有参数的函数(整个文档可以在这里find: http : //www.itu.int/rec/T-REC-H.264-201003-I/en及其免费): 如何解码SPS

在那里你可以看到一些奇怪的东西……首先,你的video尺寸是这样计算的:

 Width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_right_offset*2 - frame_crop_left_offset*2; Height = ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); 

其次,也是最重要的,在这个代码表的DESCRIPTOR列中,说明了你应该怎么做,以读取第一列中的粗体文本参数。 这就是那里的价值意思:

  • u(N) – 读取一个长度为N位的无符号数
  • s(N) – 读取一个有N位长的有符号数字
  • ue(v) – 读取一个无符号的Exp-Golomb数(v是可变长度的,所以它与ue()相同)
  • se(v) – 读取已签名的Exp-Golomb号码

这是您的Exp-Golomb解码器派上用场的地方…

所以,实现这个function,parsingSPS,你会得到你的宽度和高度。 请享用… :)

大小的计算是不正确的,应该是:

 width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2; height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2); 

实际上,只有在SPS中启用[frame_cropping_flag]时才应使用裁剪参数。 享受H.264!

关于帧大小的计算,上面的公式是不正确的。

chroma_format_idc存在时,我们必须从SPS中提取它。 当chroma_format_idc不存在时,应该推断其等于1(4:2:0色度格式)。 在这种情况下, separate_color_plane_flag没有被设置。 这意味着chromaArrayType = chroma_format_idcsubWidthCsubHeightC不等于2。

variablescropUnitX和cropUnitY派生如下:

  • 如果chromaArrayType等于0 ,则cropUnitXcropUnitY派生为:

     cropUnitX = 1 cropUnitY = 2 - frame_mbs_only_flag 
  • 否则( chromaArrayType等于23 ), cropUnitXcropUnitY派生为:

     cropUnitX = subWidthC cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag ) 

现在,您可以在上面的公式中使用cropUnitXcropUnitY来获取帧大小的正确值。