在程序流中,我得到第一个PTS包,其PTS值为“4295626096”,dts值为648000,下一个包pts值比第一个包小得多。一些pes包值如下: Pes packet1:pts 4295626096 dts 648000。 Pes packet2:pts 651600。 Pes packet3:pts 655200。 Pes packet4:pts 4295636896 dts 658800。 Pes packet5:pts 662400。 Pes packet6:pts 666000。 Pes packet7:pts 4295647696 dts 669600。 Pes packet8:pts 673200。 Pes packet9:pts 676800。 Pes packet10:pts 429565896 dts 680400。 和下一个分组分别是684000,687600,702000,694800,698400 ......现在看来是正确的。
当我搜索这个时,我发现如果SCR / PTS / DTS的33位值是1,那就是溢出的情况,但我没有在标准中找到相同的情况。
任何人都可以解释溢出情况发生时的情况以及如何处理溢出情况(获取正确的时间戳)以获得正确的PTS值。
答案 0 :(得分:0)
无论谁说第33位是溢出都是错误的。您需要做的是通过累积当前时间戳和上一个时间戳之间的差异来转换为单调时间戳
在C ++中:
int64_t subtract_timestamp(int64_t previous, int64_t current)
{
int64_t diff = current - previous;
if ((0x1FFFFFFFF/2) < -diff) {
return (0x1FFFFFFFF - previous) + current;
}
return diff;
}
int64_t previous = 0;
int64_t my_timestamp = 0;
void my_function(int64_t dts) {
my_timestamp += subtract_timestamp(previous, dts);
previous = dts;
}