3

我需要知道如何从 MPEG 传输流 (TS) 中获取高度和宽度以及我可以获取的任何其他描述性数据。

在这个答案出现之前:我很清楚视频序列标题(00 00 00 B3)。这是 MPEG程序流(即 MPEG 文件)规范的一部分,而不是MPEG 传输流。

如果我将传输流保存到 .ts 文件中,我可以从 ffmpeg 获取此信息,但我需要能够在 ffmpeg 不可用的环境中独立于 ffmpeg 执行此操作。因此,我需要手动解析文件中的这些数据,除了来自 MPEG-TS 的时间戳(切片开始)之外,我似乎无法找到任何有关任何相关元数据的信息。

谢谢!

4

3 回答 3

2

恐怕您必须检查 ISO 13818-1(也称为 H.222)并阅读一些有关传输流数据包、PID 过滤和 PES 数据包的信息。

流被分成数据包。每个数据包(通常)为 188 字节长。数据包标头包含 PID(数据包 ID),它允许您仅过滤您感兴趣的数据包。

这些数据包构成了 PES 数据包,其中包含 MPEG-2 数据 + 元数据(例如定时数据)。您需要先构建并解析 PES 数据包,然后才能找出视频的宽度和高度。

您如何知道您对哪些 PID 感兴趣?为此,您必须阅读有关 PAT 和 PMT 的信息。PAT 告诉您如何获取 PMT,PMT 告诉您哪些 PID 包含 MPEG-2 信息。

所有这些都在上述文件中进行了详细描述。但是网上有很多教程和解释。例如这里,但还有很多其他的。维基百科文章是一个很好的起点。

于 2011-07-20T19:29:11.530 回答
2

视频大小不是传输流的属性。这是基本视频流本身的属性。传输流或 PES 数据包不包含任何标头。

为了提取分辨率(宽度 x 高度),您必须识别 PES 开始(带有 PUSI)数据包,然后开始解析 es 标头。您需要提取ISO/IEC 13818-part 2 (video) 的Sequence header部分会给您答案。检查此wiki以获取快速参考。

于 2011-11-27T11:27:29.377 回答
1

实际上,视频序列头(00 00 01 B3)是 ISO/IEC 13818-2 规范的一部分,它描述了基本的视频比特流。因此传输流也将包含此标头。

这里的问题是提取此标头内容。你不能只找到这个起始代码并使用它后面的字节。这可能是一项相当复杂的任务,因为: 1. 标头内容可以拆分为两个 PES 或传输流数据包 2. 如果传输流不仅包含视频流,则此字节序列可以在一些音频或二进制数据中找到。

于 2011-08-12T04:53:46.867 回答