不!!!
您必须运行一个复杂的函数才能从序列参数集中提取视频尺寸。这个怎么做?那么首先你必须编写自己的 Exp-Golomb 解码器,或者在网上找到一个......在 live555 源代码中的某个地方有一个例如......
那么你必须得到一个 SPS 帧。它具有NAL=0x67(NAL 是 H.264 帧中的第一个字节),您可以在 SDP 中的sprop-parameter-sets 下找到它作为 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,你会得到你的宽度和高度。享受... :)