示例#1
0
        double synchronizeVideo(double videoPts)
        {
            // assume delay to next frame equals delay between previous frames
            double delay = videoPts - previousVideoPts;

            if (delay <= 0 || delay >= 1.0)
            {
                // if incorrect delay, use previous one
                delay = previousVideoDelay;
            }

            previousVideoPts   = videoPts;
            previousVideoDelay = delay;

            if (videoDecoder.HasAudio && syncMode == SyncMode.VIDEO_SYNCS_TO_AUDIO)
            {
                // synchronize video to audio
                double diff = getVideoClock() - audioPlayer.getAudioClock();

                // Skip or repeat the frame. Take delay into account
                // FFPlay still doesn't "know if this is the best guess."
                double sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD;

                if (Math.Abs(diff) < AV_NOSYNC_THRESHOLD)
                {
                    if (diff <= -sync_threshold)
                    {
                        delay = 0;
                    }
                    else if (diff >= sync_threshold)
                    {
                        delay = 2 * delay;
                    }
                }
            }

            // adjust delay based on the actual current time
            videoFrameTimer += delay;
            double actualDelay = videoFrameTimer - HRTimer.getTimestamp();

            videoDebug.VideoDelay       = delay;
            videoDebug.ActualVideoDelay = actualDelay;
            videoDebug.VideoSync        = getVideoClock();
            videoDebug.AudioSync        = audioPlayer.getAudioClock();
            videoDebug.VideoQueueSize   = videoDecoder.FrameQueue.VideoPacketsInQueue;
            videoDebug.AudioQueueSize   = videoDecoder.FrameQueue.AudioPacketsInQueue;


            return(actualDelay);
        }