Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 现在播放指示灯与AVPlayer播放不同步_Ios_Objective C_Avplayer - Fatal编程技术网

Ios 现在播放指示灯与AVPlayer播放不同步

Ios 现在播放指示灯与AVPlayer播放不同步,ios,objective-c,avplayer,Ios,Objective C,Avplayer,我有一个为视频播放制作的“正在播放”指示器视图,在大多数情况下它都能正常工作,但是我注意到我的指示器在播放时间快结束时没有完全同步 视频结束后不会像应该的那样循环,因为指示器的X原点没有穿过右侧洗涤器的X原点,这意味着同步不正确 我将感谢任何提供的帮助。这是一张在播放结束时指示器位置错误的图片 - (void)observePlayerTime { CMTime intervalTime = CMTimeMake(33, 1000); __weak typeof(self) w

我有一个为视频播放制作的“正在播放”指示器视图,在大多数情况下它都能正常工作,但是我注意到我的指示器在播放时间快结束时没有完全同步

视频结束后不会像应该的那样循环,因为指示器的X原点没有穿过右侧洗涤器的X原点,这意味着同步不正确

我将感谢任何提供的帮助。这是一张在播放结束时指示器位置错误的图片

- (void)observePlayerTime
{
    CMTime intervalTime = CMTimeMake(33, 1000);

    __weak typeof(self) weakSelf = self;

    self.playbackObserver = [self.playerLayer.player addPeriodicTimeObserverForInterval:
    intervalTime queue:dispatch_get_main_queue() usingBlock:^(CMTime time)
    {
        UICollectionViewFlowLayout *videoFrameLayout =
        (UICollectionViewFlowLayout *)
        weakSelf.videoFramesCollectionView.collectionViewLayout;

        if (weakSelf.playerLayer.player.rate >= 1.0)
        {
            CGRect newFrame = weakSelf.nowPlayingIndicatorView.frame;

            newFrame.origin.x += (videoFrameLayout.itemSize.width / intervalTime.value);

            if (newFrame.origin.x >= weakSelf.rightScrubberView.frame.origin.x)
            {
                // Here we loop the player

                CGRect newIndicatorFrame = weakSelf.nowPlayingIndicatorView.frame;

                newIndicatorFrame.origin.x = (weakSelf.leftScrubberView.frame.origin.x 
                    + weakSelf.leftScrubberView.bounds.size.width) 
                    - newIndicatorFrame.size.width;

                weakSelf.nowPlayingIndicatorView.frame = newIndicatorFrame;

                [weakSelf.playerLayer.player seekToTime:weakSelf.lastPlayerTime 
                    toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
            }
            else
            {
                weakSelf.nowPlayingIndicatorView.frame = newFrame;
            }
        }
    }];
}


我似乎已经用
dispatch\u source\t
而不是
addPeriodicTimeObserverForInterval
解决了这个问题

代码:

@property (nonatomic, strong) dispatch_source_t playbackTimer;

- (void)observePlaybackTime
{
    self.playbackTimer = CreateTimerDispatchSource(50000000, 0,
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^
    {
        dispatch_async(dispatch_get_main_queue(),^
        {
            if (self.playerLayer.player.rate >= 1.0)
            {
                UICollectionViewFlowLayout *videoFrameLayout = 
                (UICollectionViewFlowLayout *)
                self.videoFramesCollectionView.collectionViewLayout;

                CGRect newFrame = self.nowPlayingIndicatorView.frame;

                newFrame.origin.x += videoFrameLayout.itemSize.width / 20.7;

                if (newFrame.origin.x >= self.rightScrubberView.frame.origin.x)
                {
                    if (CMTIME_IS_VALID(self.lastPlayerTime))
                    {
                        // Loop playback

                        CGRect newIndicatorFrame = self.nowPlayingIndicatorView.frame;

                        newIndicatorFrame.origin.x =
                        self.leftScrubberView.frame.origin.x
                        + self.leftScrubberView.bounds.size.width;

                        self.nowPlayingIndicatorView.frame = newIndicatorFrame;

                        [self.playerLayer.player 
                        seekToTime:self.lastPlayerTime 
                        toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
                    }
                }
                else
                {
                    self.nowPlayingIndicatorView.frame = newFrame;
                }
            }
        });
    });
}

dispatch_source_t CreateTimerDispatchSource(uint64_t interval, uint64_t leeway, 
dispatch_queue_t queue, dispatch_block_t block)
{
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
    queue);

    if (timer)
    {
        dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway);

        dispatch_source_set_event_handler(timer, block);

        dispatch_resume(timer);
    }

    return timer;
}