首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在RTSP源过滤器中生成示例时间戳?

如何在RTSP源过滤器中生成示例时间戳?
EN

Stack Overflow用户
提问于 2011-10-24 18:58:50
回答 2查看 613关注 0票数 0

实际上,我已经能够生成时间戳,并且它可以与一些过滤器(多路复用器)一起工作,但是由于我希望能够使用GDCL MP4 Multiplexer Filter,所以我想讨论一下我的计算样本时间值的方法。

奇怪的是,如果我把Smart Tee Filter放在我的RTSP Source FilterGDCL MP4 Multiplexer Filter之间,一切似乎都能正常工作。我能够正确地捕获视频流。但如果没有Smart Tee Filter,我仍然可以捕捉视频,但这次会有周期性的故障。据我所知,Smart Tee Filter除了提供两个输出引脚,一个有时间戳(捕获引脚)和一个没有时间戳(预览引脚),并且这两个引脚共享相同的流缓冲区。所以,我想到的事情是,不知何故,Smart Tee Filter正在重新组织时间戳之类的东西。但是如果我不生成时间戳,Smart Tee Filter也不会生成这些值。我现在的猜测是,我计算的帧开始时间是正确的,但是帧停止时间是错误的,Smart Tee Filter正在重新计算帧停止时间,因为它们应该是正确的(当然,这只是一个猜测)。

我过去常常像下面的公式一样计算开始和停止时间。

代码语言:javascript
运行
复制
startTime = now
timeDelta = now - previousFrame
endTime = startTime + timeDelta

这不是确切的公式,但它很接近。结果如下所示。

代码语言:javascript
运行
复制
Media Time/Time: 0-1    0-0
Media Time/Time: 1-2    500028-1000056
Media Time/Time: 2-3    930053-1360078
Media Time/Time: 3-4    1610092-2290131
Media Time/Time: 4-5    2200126-2790160
Media Time/Time: 5-6    2900166-3600206
Media Time/Time: 6-7    3500200-4100234
Media Time/Time: 7-8    4240242-4980284
Media Time/Time: 8-9    4720270-5200298
Media Time/Time: 9-10   5350306-5980342
Media Time/Time: 10-11  5980342-6610378
Media Time/Time: 11-12  6610378-7240414
Media Time/Time: 12-13  7250414-7890450
Media Time/Time: 13-14  7880450-8510486
Media Time/Time: 14-15  8510486-9140522
Media Time/Time: 15-16  9140522-9770558
Media Time/Time: 16-17  9780559-10420596
Media Time/Time: 17-18  10410595-11040631
Media Time/Time: 18-19  11040631-11670667
Media Time/Time: 19-20  11680668-12320705
Media Time/Time: 20-21  12310704-12940740
Media Time/Time: 21-22  12940740-13570776
Media Time/Time: 22-23  13600778-14260816
Media Time/Time: 23-24  14220813-14840848
Media Time/Time: 24-25  14840849-15460885
Media Time/Time: 25-26  15480885-16120921
Media Time/Time: 26-27  16110921-16740957
Media Time/Time: 27-28  16740957-17370993
Media Time/Time: 28-29  17380994-18021031
Media Time/Time: 29-30  18011030-18641066
Media Time/Time: 30-31  18631065-19251100

这些是由SetMediaTime()和SetTime()方法设置的媒体时间和时间值(均采用开始-停止格式)。我看到的问题是一些开始/结束时间在连续的帧中重叠。当然,这是由抖动因素等引起的。如果我根据前一帧计算时间增量,并且如果下一帧比预期更早到达,则会发生重叠。因此,我在我的代码中做了一些小改动。我的最终代码如下所示。

代码语言:javascript
运行
复制
        _FILETIME fileTime;
        GetSystemTimeAsFileTime(&fileTime);
        now = ((((__int64)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime) - streamReader->rtpProtocolHandler->m_iReferenceTime);
        timeDelta = now - m_iFrameTimePrevious;
        m_iFrameTime = max(now, m_iFrameTime);
        m_iFrameTimePrevious = m_iFrameTime;
        REFERENCE_TIME rtStart = m_iFrameTime;
        REFERENCE_TIME rtStop;
        if(timeDelta > 0) {
            m_iFrameTime += timeDelta;
            rtStop = m_iFrameTime;
        } else {
            rtStop = rtStart;
        }
        pSample->SetTime(&rtStart, &rtStop);
        pSample->SetMediaTime(&m_iMediaTime, &(++m_iMediaTime));

结果是这样的:

代码语言:javascript
运行
复制
Media Time/Time: 0-1 0-0
Media Time/Time: 1-2 470027-940054
Media Time/Time: 2-3 940054-1380079
Media Time/Time: 3-4 1580091-2220128
Media Time/Time: 4-5 2220128-2810161
Media Time/Time: 5-6 2870164-3520200
Media Time/Time: 6-7 3520200-4110234
Media Time/Time: 7-8 4170239-4820278
Media Time/Time: 8-9 4820278-5420312
Media Time/Time: 9-10 5470313-6120348
Media Time/Time: 10-11 6120348-6720382
Media Time/Time: 11-12 6770387-7420426
Media Time/Time: 12-13 7420426-8060463
Media Time/Time: 13-14 8060463-8630494
Media Time/Time: 14-15 8630494-9140521
Media Time/Time: 15-16 9260530-9890566
Media Time/Time: 16-17 9890566-10490600
Media Time/Time: 17-18 10560604-11230642
Media Time/Time: 18-19 11230642-11840677
Media Time/Time: 19-20 11860679-12490716
Media Time/Time: 20-21 12490716-13090750
Media Time/Time: 21-22 13170754-13850792
Media Time/Time: 22-23 13850792-14450826
Media Time/Time: 23-24 14460827-15070862
Media Time/Time: 24-25 15070862-15680897
Media Time/Time: 25-26 15760902-16450942
Media Time/Time: 26-27 16450942-17060977
Media Time/Time: 27-28 17100978-17751014
Media Time/Time: 28-29 17751014-18171038
Media Time/Time: 29-30 18171040-18591066
Media Time/Time: 30-31 18771074-19371108

这一次没有重叠,但所有的小故障仍然存在。我做错了什么?

请记住,我的源过滤器与其他mp4多路复用器一起工作,如果我将智能Tee过滤器放在中间,它也可以与GDCL MP4复用器一起工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-26 00:51:26

问题不是由时间戳引起的,而是某种缓冲区损坏。智能Tee筛选器可能通过丢弃无效帧或提供源筛选器中缺失的帧队列来修复此问题。当我用适当的队列机制改变我的错误共享缓冲区时,一切都开始正常工作。

感谢Geraint Davies的大力支持和他的调试工具来解决我的问题。

票数 0
EN

Stack Overflow用户

发布于 2011-10-26 01:23:59

当使用RTSP/ RTP /RTCP时,我建议使用RTP时间戳来表示示例时间(偏移量为零)。

您如何确定每个帧的持续时间完全相同?在我的经验中,无论是使用实况来源还是基于文件的媒体,都从未出现过这种情况。当然,您的用例可能有所不同。

此外,通过计算时间戳,您无法同步多个RTP流,例如音频和视频。这是拥有RTCP发送者报告的原因之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7874573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档