获取H264Video流的尺寸

DRT*_*DRT 22 video video-processing mpeg-2 h.264 mpeg-4

我试图从H264流中获取尺寸(高度和宽度).我知道要从mpeg2流中获取相同的详细信息,您必须查看序列头开始代码后面的四个字节((01B3)).H264的逻辑是否相同?非常感谢我得到的任何帮助..

Cip*_*ipi 46

没有!!!

您必须运行复杂函数才能从序列参数集中提取视频维度.这该怎么做?那么首先你必须编写自己的指数哥伦布解码器,或者找到一个在线...在LIVE555源代码某处有一个例子...

然后你必须得到一个SPS帧.它具有NAL=0x67(NAL是H.264帧中的第一个字节),您可以sprop-parameter-sets在第一个逗号之前的第一个Base64字符串下找到SDP中的Base64编码字符串.其他逗号分隔字符串有图像参数集...这是一个SDP SPS Z0KAKYiLQDIBL0IAAB1MAAK/IAg=你需要从Base64的是这样的解码成字节数组.

然后你必须提取RAW BYTE SEQUENCE PAYLOAD,然后是该字节数组中的NAL UNIT HEADER!它通常是一个字节长,但读取只是为了确保... RBSP包含运行该seq_parameter_set_data( )函数所需的字节.因此,您需要首先剥离NAL UNIT HEADER(一个或多个字节).

这是从SPS NAL UNIT中提取RBSP字节的函数:

NAL单位

然后,当你有SPS(RBSP字节)时,你需要执行一个解析这个字节数组中的位的函数.这是在那里解析所有参数的函数(整个文档可以在这里找到:http://www.itu.int/rec/T-REC-H.264-201003-I/en及其免费): 如何解码SPS

在那里你可以看到一些奇怪的东西......首先,你的视频尺寸计算如下:

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);
Run Code Online (Sandbox Code Playgroud)

其次,最重要的是,在此代码表的DESCRIPTOR列中,说明了您应该如何阅读第一列中的粗体文本参数.这就是那里的价值观:

  • u(N) - 读取一个N位长的无符号数
  • s(N) - 读取一个N位长的有符号数
  • ue(v) - 读取无符号Exp-Golomb数(v表示可变长度,因此与其相同ue())
  • se(v) - 阅读已签名的Exp-Golomb数字

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

因此,实现此功能,解析SPS,您将获得您的宽度和高度.请享用... :)

  • 好吧,我找到一个公开的... http://www-ee.uta.edu/Dip/Courses/EE5359/H.264%20Standard2007.pdf但没有关于那些的有用信息...... (2认同)

小智 21

不幸的是,大小计算是错误的,应该是:

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);
Run Code Online (Sandbox Code Playgroud)


小智 5

实际上,只有在SPS中启用[frame_cropping_flag]时才应使用裁剪参数.享受H.264!