/// <summary> /// Pull the next message from IMessageInput and schedule it for push according to the timestamp. /// </summary> protected void ScheduleNextMessage() { bool first = _nextRTMPMessage == null; long delta; while (true) { _nextRTMPMessage = GetNextRTMPMessage(); if (_nextRTMPMessage == null) { OnItemEnd(); return; } IRtmpEvent rtmpEvent = _nextRTMPMessage.body; // filter all non-AV messages if (!(rtmpEvent is VideoData) && !(rtmpEvent is AudioData)) { continue; } rtmpEvent = _nextRTMPMessage.body; _nextTS = rtmpEvent.Timestamp; if (first) { _vodStartTS = _nextTS; first = false; } delta = _nextTS - _vodStartTS - (System.Environment.TickCount - _serverStartTS); if (delta < WAIT_THRESHOLD) { if (!DoPushMessage()) { return; } if (_state != State.PLAYING) { // Stream is paused, don't load more messages _nextRTMPMessage = null; return; } } else { break; } } VODScheduledJob job = new VODScheduledJob(this); _vodJobName = _schedulingService.AddScheduledOnceJob(delta, job); }