首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >H.264比特流中的帧计数

H.264比特流中的帧计数
EN

Stack Overflow用户
提问于 2013-10-28 18:48:13
回答 3查看 11.7K关注 0票数 5

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

一组NAL单元,它们在解码顺序上是连续的,包含一个主编码图像。除了主编码图像之外,接入单元还可以包含一个或多个冗余编码图像、一个辅助编码图像或其他NAL单元,这些单元不包含编码图像的片或片数据分区。访问单元的解码总是导致解码图像。

我想让它知道什么是实时流到服务器的FPS。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-12 20:20:56

来自ITU 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单位,nal_unit_type在14到18之间,包括(当存在时),
  • 主编码图像的第一个VCL NAL单元(始终存在)。

用于检测主编码图像的第一个VCL NAL单元的约束在第7.4.1.2.4分节中指定。

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

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

当前访问单元的主编码图像的任何编码片NAL单元或编码片数据分区A NAL单元应以下列一种或多种方式与先前访问单元的主编码图像的任何编码片NAL单元或编码片数据分区A NAL单元不同:

  • frame_num值不同。用于测试此条件的frame_num值是出现在切片头语法中的frame_num值,无论该值是否由于memory_management_control_operation等于5的存在而被推断为在解码过程中以后使用的值为0。(注1-上述语句的结果是,具有frame_num等于1的主编码图像不能包含memory_management_control_operation等于5,除非下面列出的其他条件满足了后面的下一个主编码图像(如果有的话))。
  • pic_parameter_set_id值不同。
  • field_pic_flag值不同。
  • bottom_field_flag在这两种情况下都存在,并且在价值上存在差异。
  • nal_ref_idc值不同,其中一个nal_ref_idc值等于0。
  • pic_order_cnt_type与to0是相等的,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单元)也可用于检测访问单元之间的边界,因此可能有助于检测新的主编码图像的开始。

票数 4
EN

Stack Overflow用户

发布于 2013-11-03 13:46:54

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

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

代码语言:javascript
复制
ffprobe -show_streams -count_frames -pretty filename

您可以在输出中找到:

  • nb_read_frames=...

对于fps,正如我听说ff探针可能会报告fps的一些错误一样,尝试一个简单的ffmpeg -i命令。

代码语言:javascript
复制
ffmpeg -i filename 2>&1 | sed -n "s/.*, \(.*\) fps.*/\1/p"
票数 5
EN

Stack Overflow用户

发布于 2013-11-06 17:10:30

NAL单元不一定与帧有1-1的关系.帧可以分成多个NAL单元。如果您想手动解析流,则需要处理每个类型,这些类型在下面的博客文章中定义得很好。如果流有一个SPS NAL数据包,它应该包含帧速率,但这不一定是实际的帧率,这正是容器所相信的。

当您还询问如何找到AU的实际启动时,如果它是“附件B”比特流,那么每个NALU将有一个启动代码0x000001或0x00000001。AVCC使用一个小的头来定义NALU的长度。

有关更多详细信息,请查看以下伟大的博客文章:szatmary.org

希望这能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19642736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档