计算H.264比特流中的帧

use*_*500 5 ffmpeg video-encoding video-streaming h.264

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

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

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

ale*_*son 5

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

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

ffprobe -show_streams -count_frames -pretty filename
Run Code Online (Sandbox Code Playgroud)

你会在输出中找到:

  • nb_read_frames = ....

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

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


use*_*500 4

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

\n\n

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

\n\n

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

\n\n

一个访问单元由一个主编码图像、零个或多个相应的冗余编码图像以及零个或多个非VCL NAL单元组成。VCL NAL 单元与主要或冗余编码图像的关联在子条款 7.4.1.2.5 中描述。

\n\n

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

\n\n

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

\n\n
    \n
  • 访问单元定界符 NAL 单元(如果存在),
  • \n
  • 序列参数集 NAL 单元(如果存在),
  • \n
  • 图片参数设置 NAL 单位(如果存在),
  • \n
  • SEI NAL 装置(如果存在),
  • \n
  • nal_unit_type 范围为 14 到 18(含)的 NAL 单元(如果存在),
  • \n
  • 主编码图像的第一个 VCL NAL 单元(始终存在)。
  • \n
\n\n

主编码图像的第一个 VCL NAL 单元的检测约束在子条款 7.4.1.2.4 中指定。

\n\n

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

\n\n

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

\n\n

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

\n\n
    \n
  • frame_num 的值不同。用于测试此条件的frame_num的值是出现在片头语法中的frame_num的值,无论该值是否由于内存_管理_控制_操作的存在而被推断为等于0以供后续在解码过程中使用等于 5。(注 1 \xe2\x80\x93 上述语句的结果是,frame_num 等于 1 的主编码图片不能包含等于 5 的 memory_management_control_operation,除非下一个主编码满足下面列出的一些其他条件其后的图片(如果有)。)
  • \n
  • pic_parameter_set_id 的值不同。
  • \n
  • field_pic_flag 的值不同。
  • \n
  • Bottom_field_flag 两者都存在,但值不同。
  • \n
  • nal_ref_idc 的值不同,其中一个 nal_ref_idc 值等于 0。
  • \n
  • pic_order_cnt_type 都等于 0,并且 pic_order_cnt_lsb 的值不同,或者 delta_pic_order_cnt_bottom 的值不同。
  • \n
  • pic_order_cnt_type 都等于 1,并且 delta_pic_order_cnt[ 0 ] 的值不同,或者 delta_pic_order_cnt[ 1 ] 的值不同。
  • \n
  • IdrPicFlag 的值不同。
  • \n
  • 两者的 IdrPicFlag 都等于 1,并且 idr_pic_id 的值不同。
  • \n
\n\n

(NOTE 2 \xe2\x80\x93 冗余编码图片中的一些VCL NAL单元或者一些非VCL NAL单元(例如访问单元定界符NAL单元)也可以用于访问单元之间的边界的检测,因此可以帮助检测新的主编码图像的开始。)

\n