我正在尝试从H264流中获取尺寸(高度和宽度)。我知道要从mpeg2流中获取相同的详细信息,您必须查看序列 header 开始代码((01B3))之后的四个字节。
H264是否可以使用相同的逻辑?我将不胜感激。

最佳答案

不!!!

您必须运行复杂的函数才能从“序列参数集”中提取视频尺寸。这该怎么做?好吧,首先,您必须编写自己的Exp-Golomb解码器,或在线找到一个...在live555源代码中某处有一个...

然后,您必须获得一个SPS框架。它具有NAL=0x67(NAL是H.264帧中的第一个字节),您可以在sprop-parameter-sets下找到它作为SDP中Base64编码的字符串,它是第一个逗号之前的第一个Base64字符串。其他用逗号分隔的字符串还有图片参数集...这是来自SDP Z0KAKYiLQDIBL0IAAB1MAAK/IAg=的一个SPS,您需要将类似的内容从Base64解码为字节数组。

然后,您必须提取RAW BYTE SEQUENCE PAYLOAD ,然后在该字节数组中添加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);

其次,也是最重要的一点,在此代码表的DESCRIPTOR列中,说明了如何读取第一列中的粗体文本参数。这是其中的值的含义:
  • u(N)-读取N位长的无符号数字
  • s(N)-读取一个N位长的带符号数字
  • ue(v)-读取一个无符号的Exp-Golomb数字(v表示可变长度,因此与ue()相同)
  • se(v)-读取带符号的Exp-Golomb编号

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

    因此,实现此功能,解析SPS,您将获得Width和Height。请享用... :)

    07-27 13:39