如何在H.264 MPEG-2 TS中找到分辨率和帧速率值?

时间:2014-08-20 06:59:56

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

我正在研究包含H.264流的MPEG-2 TS视频,我正在寻找存储在流中的视频属性,通过扫描PAT,PMT,PES等。

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

下面,传输流数据包编辑器能够找到两种不同的信息,一种是本身,另一种是来自Haali Media Decoder助手编解码器。如何获得第一个:

enter image description here

欢迎使用伪代码。

4 个答案:

答案 0 :(得分:4)

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

每个H.264帧都以四个或三个字节的序列头 0x00 0x00 0x01 0x00 0x00 0x00 0x01 开头。如果在启动标头等于0x07后的下一个字节进行AND运算,则帧是SPS帧。

E.g。 SPS帧0x00 0x00 0x00 0x01 0x67 ...执行AND操作(0x67& 0x1F)= 0x07

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

希望这有帮助。

答案 1 :(得分:3)

不,它们不在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. 从标头字节检查NAL单元的类型(最后5位)。

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

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

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

答案 2 :(得分:1)

我假设工作代码驻留在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]

答案 3 :(得分:1)

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

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

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

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

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