Filter 如何在RTSP源筛选器中生成样本时间戳?
实际上,我已经能够生成时间戳,并且它可以与一些过滤器(muxer)一起工作,但是由于我希望能够使用Filter 如何在RTSP源筛选器中生成样本时间戳?,filter,timestamp,directshow,rtsp,Filter,Timestamp,Directshow,Rtsp,实际上,我已经能够生成时间戳,并且它可以与一些过滤器(muxer)一起工作,但是由于我希望能够使用gdclmp4多路复用器过滤器,因此我想讨论我计算采样时间值的方法 奇怪的是,如果我把智能Tee过滤器放在我的RTSP源过滤器和gdclmp4多路复用器过滤器之间,一切似乎都正常工作了。我能够正确地捕获视频流。但如果没有智能T形过滤器,我仍然能够捕获视频,但这次会出现周期性故障。据我所知,Smart-Tee-Filter除了提供两个输出管脚(一个带有时间戳(捕获管脚),另一个没有时间戳(预览管脚),
gdclmp4多路复用器过滤器
,因此我想讨论我计算采样时间值的方法
奇怪的是,如果我把智能Tee过滤器
放在我的RTSP源过滤器
和gdclmp4多路复用器过滤器
之间,一切似乎都正常工作了。我能够正确地捕获视频流。但如果没有智能T形过滤器
,我仍然能够捕获视频,但这次会出现周期性故障。据我所知,Smart-Tee-Filter
除了提供两个输出管脚(一个带有时间戳(捕获管脚),另一个没有时间戳(预览管脚),其他功能都不多,而且两个管脚共享相同的流缓冲区。因此,我的脑海中浮现出的是,不知何故,Smart-Tee-Filter
正在重新组织时间戳之类的东西。但如果我不生成时间戳,Smart-Tee-Filter
也不会生成这些值。我目前的猜测是,我正在正确计算帧开始时间,但帧停止时间不正确,Smart Tee Filter
正在重新计算帧停止时间(当然这只是一个猜测)
我曾经用下面的公式计算开始和停止时间
startTime = now
timeDelta = now - previousFrame
endTime = startTime + timeDelta
这不是一个精确的公式,但很接近。结果如下
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
_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));
这些是由SetMediaTime()和SetTime()方法设置的媒体时间和时间值(均为开始-停止格式)。我看到的问题是一些开始/结束时间在连续帧中重叠。当然,这是由抖动因素等引起的。如果我根据前一帧计算时间增量,并且如果下一帧到达时间早于预期,则会发生重叠。所以,我对代码做了一点修改。我的最终代码如下所示
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
_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));
这次没有重叠,但所有的小故障仍然存在。我做错了什么
请记住,我的源过滤器与其他MP4的MUXER工作,它也与GDCL MP4 MUXER工作,如果我把智能TEE过滤器在中间。
问题不是由时间戳造成的,而是某种类型的缓冲区损坏。Smart Tee筛选器可能通过删除无效帧或提供源筛选器中缺少的帧队列来修复此问题。当我用适当的队列机制更改了我的buggy共享缓冲区时,一切都开始正常工作
感谢Geraint Davies为解决我的问题提供的大力支持和调试工具。使用RTSP/RTP/RTCP时,我建议使用RTP时间戳作为示例演示时间(偏移量为零) 如何确保每个帧的持续时间完全相同? 根据我的经验,无论是使用实时资源还是基于文件的媒体,情况都从未如此。当然,您的用例可能会有所不同 此外,通过计算时间戳,您无法同步多个RTP流,例如音频和视频。这是RTCP发送方报告的原因之一