提取H264Video流的尺寸

我正在尝试从H264流中获取尺寸(高度和宽度)。我知道要从mpeg2流中获取相同的详细信息,您必须查看序列头起始码((01B3))之后的四个字节。 H264可以使用相同的逻辑吗?我将不胜感激。     
已邀请:
        没有!!! 您必须运行一个复杂的函数才能从“序列参数集”中提取视频尺寸。这该怎么做?好吧,首先您必须编写自己的Exp-Golomb解码器,或者在线找到一个...在live555源代码中某处有一个示例... 然后,您必须获得一个SPS框架。它具有
NAL=0x67
(NAL是H.264帧中的第一个字节),您可以在in1 as中找到它作为SDP中Base64编码的字符串,它是第一个逗号之前的第一个Base64字符串。其他用逗号分隔的字符串还有图片参数集...这是来自SDP
Z0KAKYiLQDIBL0IAAB1MAAK/IAg=
的一个SPS,您需要将类似的内容从Base64解码为字节数组。 然后,您必须提取该字节数组中紧跟着NAL UNIT HEADER的RAW BYTE SEQUENCE PAYLOAD!它通常是一个字节长,但请确保继续阅读... 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);
其次,也是最重要的一点,在此代码表的DESCRIPTOR列中,说明了如何读取第一列中的粗体文本参数。这是其中的值的含义: u(N)-读取一个N位长的无符号数字 s(N)-读取一个N位长的有符号数 ue(v)-读取一个无符号的Exp-Golomb数(v是可变长度的,因此与
ue()
相同) se(v)-读取签名的Exp-Golomb编号 这是您的Exp-Golomb解码器派上用场的地方... 因此,实现此功能,解析SPS,您将获得Width和Height。请享用... :)     
        不幸的是,尺寸计算是错误的,应为:
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!     
        关于帧大小的计算,以上公式不正确。 当存在“ 7”时,我们必须从SPS中提取它。 当“ 7”不存在时,应推断为等于1(4:2:0色度格式)。在这种情况下,ѭ9将不被设置。这意味着
chromaArrayType = chroma_format_idc
subWidthC
subHeightC
等于2。 变量cropUnitX和cropUnitY的派生如下: 如果
chromaArrayType
等于
0
,则
cropUnitX
cropUnitY
推导为:
cropUnitX = 1
cropUnitY = 2 - frame_mbs_only_flag
否则(
chromaArrayType
等于
1
2
3
),
cropUnitX
cropUnitY
推导为:
cropUnitX = subWidthC
cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag )
现在,您可以在上述公式中使用
cropUnitX
cropUnitY
来获取帧大小的正确值。     

要回复问题请先登录注册