我正在研究包含H.264流的MPEG-2 TS视频,我正在寻找存储在流中的视频属性,通过扫描PAT,PMT,PES等。
我能够读取PAT,PMT和基本流类型和PID。在这里,我想找到分辨率和帧率(fps)。它们位于PES标题中还是其他位置?它们不属于PAT或PMT。
下面,传输流数据包编辑器能够找到两种不同的信息,一种是本身,另一种是来自Haali Media Decoder助手编解码器。如何获得第一个:
欢迎使用伪代码。
答案 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(网络适应层)单元的步骤:
解析NAL单元前缀(NAL单元前缀为3(0x00,0x00,0x01)或4(0x00,0x00,0x00,0x01)字节代码)然后是Header(前缀代码后的下一个字节)
从标头字节检查NAL单元的类型(最后5位)。
如果NAL单位是7类型的意思,那么这个NAL单位是SPS NAL单位然后解析代码
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。