Exemplo n.º 1
0
        private async Task <IVideoFrame> QueryFrameAsync()
        {
            IVideoFrame frame = null;

            switch (_state)
            {
            case State.Stop:
                break;

            case State.Refresh:
            {
                frame  = _currentFrame;
                _state = State.Stop;
            }
            break;

            case State.StopBy:
            {
                do
                {
                    frame = await _videoReader.QueryFrameAsync();
                }while (frame != null && frame.Timestamp < _stopByTargetTime);

                _state            = State.Stop;
                _stopByTargetTime = 0.0;
            }
            break;

            case State.Play:
            {
                double frameInterval = 1000.0 / _videoProperties.FrameRate;

                DateTime currentTime = DateTime.Now;
                if (_playElapsed + (currentTime - _playUpdateTime).TotalMilliseconds < frameInterval)
                {
                    return(null);
                }

                do
                {
                    frame = await _videoReader.QueryFrameAsync();

                    _playElapsed -= frameInterval;
                    currentTime   = DateTime.Now;
                }while (frame != null && _playElapsed + (currentTime - _playUpdateTime).TotalMilliseconds >= frameInterval);

                _playElapsed   += (currentTime - _playUpdateTime).TotalMilliseconds;
                _playUpdateTime = currentTime;

                if (frame == null)
                {
                    _state = State.Stop;
                }
            }
            break;
            }

            return(frame);
        }