计算H.264比特流中的帧

时间:2013-10-28 18:48:13

标签: ffmpeg video-streaming h.264 video-encoding

如何计算/检测原始H.264比特流中的帧(图片)?我知道有5种VCL NALU类型,但我不知道如何rec(k)将它们的序列识别为访问单元。我想检测一个帧意味着检测一个访问单元作为访问单元

  

一组NAL单元,它们按解码顺序连续并包含   恰好是一个主要编码图片。除了主要编码   图片中,访问单元还可以包含一个或多个冗余编码   图片,一个辅助编码图片,或其他NAL单元   包含编码图像的切片或切片数据分区。该   访问单元的解码总是产生解码图像。

我希望它知道实时流出服务器的FPS是什么。

3 个答案:

答案 0 :(得分:5)

您的解释是正确的,如果您想自己解析流,请查看here

但是要以易于阅读和解析的格式(使用任何文本解析器)快速提取流信息,您可以使用ffprobe

ffprobe -show_streams -count_frames -pretty filename

您将在输出中找到:

  • nb_read_frames = ....

对于fps,我听说ffprobe可能会报告fps的一些错误,请尝试一个简单的ffmpeg -i命令。

ffmpeg -i filename 2>&1 | sed -n "s/.*, \(.*\) fps.*/\1/p"

答案 1 :(得分:4)

来自ITU-T H.264(03/2009):

7.4.1.2.3 NAL单位和编码图片的顺序以及与访问单元的关联

本小节规定了NAL单元和编码图像的顺序以及与符合附件A中规定的一个或多个配置文件的编码视频序列的访问单元的关联,这些配置文件是使用第2-9条规定的解码过程解码的。

访问单元包括一个主要编码图像,零个或多个相应的冗余编码图像,以及零个或多个非VCL NAL单元。 VCL NAL单元与主要或冗余编码图像的关联在7.4.1.2.5中描述。

比特流中的第一个访问单元从比特流的第一个NAL单元开始。

在主要编码图片的最后一个VCL NAL单元之后的以下任何NAL单元中的第一个指定新访问单元的开始:

  • 访问单元分隔符NAL单元(如果存在),
  • 序列参数集NAL单元(如果存在),
  • 图片参数设置NAL单元(如果存在),
  • SEI NAL单位(如果有),
  • nal_unit_type的NAL单位,范围为14到18,包括(如果存在),
  • 主要编码图片的第一个VCL NAL单元(始终存在)。

主要编码图像的第一个VCL NAL单元的检测限制在7.4.1.2.4中规定。

7.4.1.2.4检测主要编码图像的第一个VCL NAL单元

本小节规定了对VCL NAL单元语法的约束,这些约束足以使每个主要编码图像的第一个VCL NAL单元能够检测符合附件A中指定的一个或多个被解码的配置文件的编码视频序列使用第2-9节中指定的解码过程。

任何编码切片NAL单元或编码切片数据分区当前存取单元的主要编码图像的NAL单元应不同于任何编码切片NAL单元或编码切片数据分区A NAL单元的主要编码图像。先前的访问单元有以下一种或多种方式:

  • frame_num值不同。用于测试此条件的frame_num的值是出现在切片标头的语法中的frame_num的值,无论该值是否被推断为等于0,以便由于memory_management_control_operation的存在而在解码过程中随后使用等于5.(注1 - 上述陈述的结果是,frame_num等于1的主要编码图像不能包含等于5的memory_management_control_operation,除非下面列出的下一个主要编码图像满足下面列出的某些其他条件(如果有的话)。)
  • pic_parameter_set_id值不同。
  • field_pic_flag值不同。
  • bottom_field_flag存在于两者中且值不同。
  • nal_ref_idc的值不同,其中一个nal_ref_idc值等于0.
  • pic_order_cnt_type对于两者都等于0,并且pic_order_cnt_lsb的值不同,或者delta_pic_order_cnt_bottom的值不同。
  • pic_order_cnt_type对于两者都等于1,并且delta_pic_order_cnt [0]的值不同,或者delta_pic_order_cnt [1]的值不同。
  • IdrPicFlag的价值不同。
  • 两者的IdrPicFlag等于1,而idr_pic_id的值不同。

(注2 - 冗余编码图像中的一些VCL NAL单元或一些非VCL NAL单元(例如,访问单元定界符NAL单元)也可用于检测访问单元之间的边界,并且可以因此有助于检测新的主要编码图像的开始。)

答案 2 :(得分:0)

NAL单位与帧必然没有1-1的关系。帧可以分成多个NAL单元。如果要手动解析流,则需要处理下面的博客文章中定义的每种类型。如果流有一个SPS NAL数据包,它应该包含帧速率,但这不一定是实际帧速率,只是容器认为它具有的速率。

当您询问如何找到AU的实际开始时,如果它是“附件B”比特流,则每个NALU将具有起始码0x000001或0x00000001。 AVCC使用一个小标题来定义NALU的长度。

查看以下精彩博文,了解更多详情:szatmary.org

希望有所帮助!