我正在尝试从H264流中获取尺寸(高度和宽度)。 我知道,要从mpeg2流中获取相同的细节,您必须查看序列头启动代码(01B3)后面的四个字节。 同样的逻辑是否适用于H264? 如果有任何帮助,将不胜感激。
我正在尝试从H264流中获取尺寸(高度和宽度)。 我知道,要从mpeg2流中获取相同的细节,您必须查看序列头启动代码(01B3)后面的四个字节。 同样的逻辑是否适用于H264? 如果有任何帮助,将不胜感激。
不行!!!
你必须运行一个复杂的函数来从序列参数集中提取视频尺寸。如何做呢?首先,你必须编写自己的Exp-Golomb解码器或在网络上找到一个...例如,在live555源代码中,就有一个...
然后你必须获取一个SPS帧。它的NAL值为NAL=0x67
(NAL是H.264帧中的第一个字节),你可以在SDP中找到它作为Base64编码字符串的形式,出现在sprop-parameter-sets
下的第一个逗号之前的第一个Base64字符串。那里的其他逗号分隔的字符串是Picture Parameter Sets...这是一个来自SDP的SPS:Z0KAKYiLQDIBL0IAAB1MAAK/IAg=
,你需要将其从Base64解码成一个字节数组。
接着你必须提取原始字节序列负载(RAW BYTE SEQUENCE PAYLOAD),后面紧跟着NAL单元头(NAL UNIT HEADER)!!! 它通常只有一个字节长,但建议继续阅读以确保...RBSP 包含运行 seq_parameter_set_data( )
函数所需的字节。因此,您需要首先剥离NAL UNIT HEADER(一个或多个字节)。
这里是从SPS NAL UNIT中提取RBSP字节的函数:
然后,当你有了SPS(RBSP字节)之后,你需要执行一个函数,解析这个字节数组中的位。下面是该函数已解析出所有参数的示例(完整文档可以在此处找到:http://www.itu.int/rec/T-REC-H.264-201003-I/en,且免费提供):
在那里,你可以看到一些奇怪的东西...首先,你的视频尺寸是这样计算的:
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);
ue()
相同)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吧!
If chromaArrayType
is equal to 0
, cropUnitX
and cropUnitY
are derived as:
cropUnitX = 1
cropUnitY = 2 - frame_mbs_only_flag
Otherwise (chromaArrayType
is equal to 1
, 2
, or 3
), cropUnitX
and cropUnitY
are derived as:
cropUnitX = subWidthC
cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag )
cropUnitX
和cropUnitY
来获得正确的帧大小值。