7

我有一个 MPEG2 TS 文件,现在我有兴趣从每个图片帧中提取 PTS 信息。我知道 PTS 用 33 位描述,包括 3 个标记位。但我不知道如何将这个位域转换为更易于理解的形式(秒、毫秒)。有人可以帮我吗

4

2 回答 2

18

MPEG2 传输流时钟(PCR、PTS、DTS)均以 1/90000 秒为单位。PTS 和 DTS 具有您需要跳过的三个标记位。模式总是(从最高有效位到最低有效位)3 位,标记,15 位,标记,15 位,标记。标记必须等于 1。在 C 中,删除标记的工作方式如下:

uint64_t v; // this is a 64bit integer, lowest 36 bits contain a timestamp with markers
uint64_t pts = 0;
pts |= (v >> 3) & (0x0007 << 30); // top 3 bits, shifted left by 3, other bits zeroed out
pts |= (v >> 2) & (0x7fff << 15); // middle 15 bits
pts |= (v >> 1) & (0x7fff <<  0); // bottom 15 bits
// pts now has correct timestamp without markers in lowest 33 bits 

它们还有一个 9 位的扩展字段,形成一个 42 位整数,其中扩展是最低有效位。基本+扩展的单位是 1/27000000 秒。许多实现将扩展保留为全零。

于 2012-11-30T13:44:02.477 回答
7

24hours/day * 60min/hr * 60secs/min *90k/sec (clock) = 7962624000,需要33位来表示;您可以使用此信息从时钟中提取时间;

于 2013-05-16T23:59:27.777 回答