2

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

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

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

在此处输入图像描述

欢迎使用伪代码。

4

4 回答 4

5

不,它们不存在于 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 单元然后解析代码

此 ITU 链接提供有关 h.264 标准的文档

请参阅第7.3.2.1.1节:序列参数集数据语法给出了在 SPS 中查找参数的语法。

于 2014-09-24T12:14:51.410 回答
5

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

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

例如 SPS 帧 0x00 0x00 0x00 0x01 0x67 ... 进行与运算 (0x67 & 0x1F) = 0x07

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

希望这可以帮助。

于 2014-08-20T09:08:05.177 回答
1

我认为此工作代码驻留在FFMPEG 项目的 ffprobe 二进制文件中,因为它会产生所需的输出:

$ 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]
于 2014-08-23T06:53:34.133 回答
1

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

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

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

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

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

于 2014-09-24T04:57:13.567 回答