我有一个MPEG2 TS文件,现在我有兴趣从每个相框中提取PTS信息。我知道PTS用33位描述,包括3个标记位。但我不知道如何将这个位域转换为更易理解的形式(秒,毫秒)。请有人帮帮我吗
答案 0 :(得分:15)
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秒。许多实现都将扩展名保留为全零。
答案 1 :(得分:4)
24小时/天* 60分钟/小时* 60秒/分钟* 90k /秒(时钟)= 7962624000,需要33位表示;您可以使用此信息从时钟中提取时间;