我有一个MPEG2 TS文件,现在我想从每个图像帧中提取PTS信息。我知道PTS用33位描述,包括3个标记位。但是我不知道如何将这个位字段转换为更易于理解的形式(秒,毫秒)。请问有谁可以帮助我吗?
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秒。许多实现将扩展设置为全零。
每天24小时 * 每小时60分钟 * 每分钟60秒 * 90k/秒(时钟)= 7962624000,需要33位才能表示;您可以使用此信息从时钟中提取时间;