【问题标题】:How to find resolution and framerate values in H.264 MPEG-2 TS?如何在 H.264 MPEG-2 TS 中找到分辨率和帧率值?
【发布时间】:2014-08-20 06:59:55
【问题描述】:

我正在处理包含 H.264 流的 MPEG-2 TS 视频,并且我正在通过扫描 PAT、PMT、PES 等来查找存储在流中的视频属性。

我能够读取 PAT、PMT 和基本流类型和 PID。在这里我想找到分辨率和帧率(fps)。它们位于 PES 标头中还是其他位置?它们不在 PAT 或 PMT 中。

在下面,Transport Stream Packet Editor 能够找到两种不同的信息,一种是自身信息,另一种来自 Haali Media Decoder 辅助编解码器。如何获得第一个:

欢迎使用伪代码。

【问题讨论】:

    标签: resolution h.264 frame-rate mpeg2-ts


    【解决方案1】:

    我不确定 MPEG2TS 标头中高度宽度信息的可用性。因为 TS 文件可以有多个程序。但是,如果您只针对由 H.264 基本流组成的 TS 文件,那么您可以从 H.264 基本流的 SPS 中获取这些信息。

    每个 H.264 帧都以四或三个字节的序列头 0x00 0x00 0x010x00 0x00 0x00 0x01 开头。如果与起始标头后的下一个字节进行 AND 操作等于 0x07,则该帧是 SPS 帧。

    例如SPS 帧 0x00 0x00 0x00 0x01 0x67 ... 做 AND 操作 (0x67 & 0x1F) = 0x07

    解析 SPS 标头也不是一件容易的事,但您可以在 ffmpeg 源代码中找到详细信息。

    希望这会有所帮助。

    【讨论】:

    【解决方案2】:

    不,它们不存在于 PES 标头中。要从 MPEG2-TS 中的 H.264 视频中找到分辨率和帧速率,您需要从 H.264 流中解析 SPS(序列参数集)。

    这些是解析 H.264 NAL(网络适配层)单元的步骤:

    1. 解析 NAL 单元前缀(NAL 单元前缀是 3(0x00,0x00,0x01) 或 4(0x00,0x00,0x00,0x01) 字节码)然后是 Header(前缀码之后的下一个字节)

    2. 从 Header 字节检查 NAL 单元的类型(最后 5 位)。

    3. 如果 NAL 单元是类型 7 的意思,这个 NAL 单元是 SPS NAL 单元然后解析代码

    This ITU link gives the documentation about h.264 standard.

    参见 7.3.2.1.1 部分:序列参数集数据语法给出了在 SPS 中查找参数的语法。

    【讨论】:

      【解决方案3】:

      我认为它的工作代码驻留在ffprobe binary for the FFMPEG project 内,因为它会产生所需的输出:

      $ ffprobe -v quiet -show_streams output1.mp4 
      [STREAM]
      index=0
      codec_name=h264
      ... // A bunch of stream data
      width=1280
      height=1024
      sample_aspect_ratio=1:1
      display_aspect_ratio=5:4
      ....
      r_frame_rate=30000/1001
      avg_frame_rate=30000/1001
      time_base=1/30000
      ...
      [/STREAM]
      

      【讨论】:

      • 这可以帮助我,但阅读所有 ffprobe 代码对我来说并不是最简单的方法。
      【解决方案4】:

      您要查找的信息位于 H.264 SPS NAL 单元内。

      您需要解析 PES 数据,提取 NALU,然后解析 SPS 数据。在那里你会找到解决方案。如果 SPS 带有 VUI 信息,则您可以获得有关所需帧速率的信息。

      MPEG2-TS 是一种传输流,它传输一些东西,但不携带有关它所携带的内容的详细信息。它只是包装东西。

      您可以从 MPEG2-TS 中使用 PES 标头的 PTS/DTS,并根据提供的演示时间戳平均帧速率。

      要正确执行此操作,请解析 PES 标头,解析 NALU 标头,解析实际的 SPS NAL 单元以及它包含的 VUI(如果存在)。

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 2020-11-23
        • 2021-06-18
        相关资源
        最近更新 更多