【问题标题】:How to handle overflow case of PTS/DTS/SCR values in program stream如何处理程序流中PTS/DTS/SCR值溢出的情况
【发布时间】:2017-05-29 12:43:13
【问题描述】:

在程序流中,我得到了第一个 PTS 值为“4295626096”和 dts 值为 648000 的 pes 数据包,并且下一个数据包的 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。 并且下一个数据包 pts 是 684000、687600、702000、694800、698400 ......现在看来是正确的。

当我对此进行谷歌搜索时,我发现如果 SCR/PTS/DTS 的 33 位值为 1,这是溢出的情况,但我在标准中没有发现相同的情况。

任何人都可以解释发生溢出情况的情况以及如何处理溢出情况(以获得正确的时间戳)以获得正确的 PTS 值。

【问题讨论】:

    标签: mpeg2-ts


    【解决方案1】:

    谁说第 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;
    }
    

    【讨论】:

    • 谢谢萨特玛丽。我对您的代码有两个疑问。 1. 您想通过将可能的 pts/dts max_value 0x1FFFFFFFF 除以 2 [ if ((0x1FFFFFFFF/2)
    • 您缺少的边缘情况是非单调输入。如果 previous 为 2 而 current 为 1,则它不是溢出而是非单调时间戳。在这种情况下,此代码将返回 -1,以便您处理错误。我们正在检查的是,当它从 X 到 Y 时,它是否覆盖了超过 50% 的数字线。如果是这样,这是一个错误,而不是翻转(这是时间戳的标准做法)
    • 抱歉打错了。 (我在通勤火车上写的)已修复。
    • 基本上,从当前到上一个的最短路径是什么,回到我来的方式(负差异)或继续溢出?这就是计算的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2019-10-10
    相关资源
    最近更新 更多