获取H264videostream的尺寸
我正在尝试从H264stream获取尺寸(高度和宽度)。 我知道要从mpeg2stream中获取相同的细节,您必须查看序列头开始代码((01B3))之后的四个字节。 H264的逻辑是否一样? 将不胜感激任何帮助,我得到..
没有!!!
您必须运行复杂的function从序列参数集中提取video尺寸。 如何做到这一点? 那么首先你必须编写你自己的Exp-Golomb解码器,或者在网上find一个…在live555源代码的地方有一个例如…
那么你必须得到一个SPS框架。 它具有NAL=0x67
(NAL是H.264帧中的第一个字节),你可以在SDP下的sprop-parameter-sets
find它作为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字节的函数:
然后当你有SPS(RBSP字节)时,你需要执行一个函数来分析这个字节数组中的位。 这里是parsing所有参数的函数(整个文档可以在这里find: http : //www.itu.int/rec/T-REC-H.264-201003-I/en及其免费):
在那里你可以看到一些奇怪的东西……首先,你的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_idc
和subWidthC
和subHeightC
不等于2。
variablescropUnitX和cropUnitY派生如下:
-
如果
chromaArrayType
等于0
,则cropUnitX
和cropUnitY
派生为:cropUnitX = 1 cropUnitY = 2 - frame_mbs_only_flag
-
否则(
chromaArrayType
等于2
或3
),cropUnitX
和cropUnitY
派生为:cropUnitX = subWidthC cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag )
现在,您可以在上面的公式中使用cropUnitX
和cropUnitY
来获取帧大小的正确值。