【问题标题】:x264/avcodec: Deduce frame sequence number from NAL unitx264/avcodec:从 NAL 单元推导出帧序列号
【发布时间】:2014-05-13 20:59:48
【问题描述】:

我在我的项目中使用 avcodec H264 解码器。我从网络接收 NAL 单元,将来自同一帧的 NAL 粘在一起(在网络层添加了额外的标头),然后传递给解码器。我想知道帧序列号是否被编码到 NAL 单元中——这是合乎逻辑的,因为我们需要对 IDR 帧的引用。

如果存在此信息 - 我如何提取它?

现在我正在研究 ITU-T H.264 规范,我承认这非常复杂。到目前为止,我还没有找到我的问题的答案。

【问题讨论】:

  • 我不确定您到底想找到什么。如果您试图找出不同的 NAL 是否对应于同一帧,那么您需要阅读“7.4.1.2.4 检测主编码图片的第一个 VCL NAL 单元”。注意 slice_header 中相同的 frame_num 并不足以说明 NAL 对应的是同一帧。
  • 谢谢。这正是问题所在 - 我如何理解 NAL 来自同一框架?它们在传递给解码器的块中应该按什么顺序排列?
  • @nobody555,据我所见-切片标头中的 frame_num 与帧序列号完全对应,即使它每个 MaxFrameNum 溢出也不是问题-我不会制作帧缓冲区大于该值。另外我使用的是基线配置文件,所以切片顺序无关紧要,所以 frame_num 应该足够了。我是不是哪里错了?

标签: c++ h.264 libavcodec x264


【解决方案1】:

没有。 frame_num 是不够的(因为它对于不同的帧可以是相等的,而不是由于 MaxFrameNum 帧溢出)。例如,后续的 B 帧可以具有相同的 frame_num 但不同的 pic_order_cnt_lsb。正如我所说,您需要阅读 H.264 规范中的“7.4.1.2.4 检测主编码图片的第一个 VCL NAL 单元”,以从不同的主编码图片中找出 NAL。要找出一张图片中 NAL 的顺序,您可以分析 first_mb_in_slice 的值。

【讨论】:

  • 基线配置文件也是如此,我们只有 I 和 P 帧吗?
  • 是的,如果我们按照 H.264 规范进行一般性讨论,这是可能的。但是你真的会看到这样的事情取决于编码器的实现吗? AFAIK x264 将为此类基线流中的每个 P 帧增加 frame_num,但如果您将有后续的 IDR 帧,它们将具有相等的 frame_num(它应该被强制为零)但将具有不同的 idr_pic_id。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2017-03-17
  • 1970-01-01
  • 2015-11-02
  • 2013-05-22
  • 2020-08-25
  • 2011-10-15
  • 2014-04-29
相关资源
最近更新 更多