вторую неделю не могу понять в чём дело, может подскажете:
есть граф состоящий из CaptureFilter и рендерера.
CaptureFilter принимает с IP камеры видео поток в H264 и каждому семплу назначает время (через SetTime() и SetMediaTime()). Для SetTime берется stream time фильтра: m_pFilter->StreamTime(rtStart); Для SetMedaTime() берется FILETIME через GetSystemTimeAsFileTime().
Время на камере синхронизируется со временем на сервере.
Всё работает нормально первые несколько часов. Потом визуально изображение начинает отставать от реальности и имеется некий "эффект робота" — часть семплов проигрывается сразу (или отбрасывается). Как я понимаю из MSDN, такое может быть если время семпла "в будущем". Тогда рендерер ждёт этого "будущего" для правильного отображения и/или отображает ключевые фреймы быстрее.
По логам видно, что с камеры приходит равномерный и "правильный" поток (т.е. ключевые фреймы на месте, размеры в норме, равномерно распределены). Но время в графе идет быстрее, чем в системе. Мне не совсем понятно, какое время использует рендерер для отображения? Графа? тогда не должно было быть проблем. Системы? Но там вроде с точностью нелады.
Вот пример времён при старте стрима:
12:06:11( 8852) T5 : VID tStart(0:00:01.970), tStop(0:00:02.036), Bytes(9168) Key(0)
Через сутки видно что tStart (оно же время стрима) ушло вперед на 0.822c.
12:06:08(86406941) T5 : VID tStart(24:00:00.062), tStop(24:00:00.128), Bytes(180) Key(0)
Ещё через сутки ушло на 1.113c
11:06:09(172807739) T5 : VID tStart(48:00:00.860), tStop(48:00:00.926), Bytes(173) Key(0)
(я по логам миллисекунды для времени системы взял, так что довольно точно уход подсчитал)
Что можно сделать? рестартовать граф регулярно? создать свой источник времени (CBaseRefClock) и подтягивать его ко времени системы?