AVPlayer seekToTime :toleranceBefore:toleranceAfter hangs Intermittently

标签 avplayer seektotime

我正在调用 AVPlayer seekToTime:toleranceBefore:toleranceAfter 间歇性挂起,没有完成(甚至没有调用完成 block )。我查看了其他 stackoverflow 但没有成功。

[AVPlayer seekToTime:CMTimeMakeWithSeconds (19,1) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {}];

有人遇到过这个问题吗?

最佳答案

技术问答QA1820 如何使用 AVPlayer seekToTime: 实现流畅的视频擦洗?

问:我的应用程序允许用户结合使用 slider 控件和 AVPlayer seekToTime: 来拖动视频文件:但是视频帧的显示存在相当大的延迟。如何实现更顺畅的擦洗?

A:避免快速连续调用 AVPlayer seekToTime:。这将取消正在进行的搜索,导致大量搜索而不是大量显示目标帧。相反,使用 AVPlayer seekToTime: 的完成处理程序变体,并等待正在进行的查找先完成,然后再发出另一个。 list 1 和 list 2 给出了这种技术的示例(注意:这些示例假设已经创建了一个有效的播放器对象,并且播放器的当前项目状态正在通过键值观察进行维护。有关更多信息,请参阅 AV Foundation 编程指南)。

使用 AVPlayer seekToTime 的完成处理程序变体:用于更平滑的擦洗(Objective-C)。

@import AVFoundation;

@interface MyClass ()
{
    AVPlayer player;
    BOOL isSeekInProgress;
    CMTime chaseTime;
    AVPlayerStatus playerCurrentItemStatus; // your player.currentItem.status
    ...
}

@implementation MyClass

...

- (void)stopPlayingAndSeekSmoothlyToTime:(CMTime)newChaseTime
{
    [self->player pause];

    if (CMTIME_COMPARE_INLINE(newChaseTime, !=, self->chaseTime))
    {
        self->chaseTime = newChaseTime;

        if (!self->isSeekInProgress)
            [self trySeekToChaseTime];
    }
}

- (void)trySeekToChaseTime
{
    if (playerCurrentItemStatus == AVPlayerItemStatusUnknown)
    {
        // wait until item becomes ready (KVO player.currentItem.status)
    }
    else if (playerCurrentItemStatus == AVPlayerItemStatusReadyToPlay)
    {
        [self actuallySeekToTime];
    }
}

- (void)actuallySeekToTime
{
    self->isSeekInProgress = YES;
    CMTime seekTimeInProgress = self->chaseTime;
    [self->player seekToTime:seekTimeInProgress toleranceBefore:kCMTimeZero
    toleranceAfter:kCMTimeZero completionHandler:
     ^(BOOL isFinished)
     {
         if (CMTIME_COMPARE_INLINE(seekTimeInProgress, ==, self->chaseTime))
             self->isSeekInProgress = NO;
         else
             [self trySeekToChaseTime];
     }];
}

@end

关于AVPlayer seekToTime :toleranceBefore:toleranceAfter hangs Intermittently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30121535/

相关文章:

ios - AVPlayer 中的 SeekToTime 在前进时停止播放流音频

ios - avplayer 在 seekToTime 上完成歌曲

swift - 即使有公差,AVPlayer Seek 也不准确Before : kCMTimeZero

swift - Mac OS AVPlayer Xcode 10.2.1 swift 5.0.1 无法运行

ios - AvPlayer 无法在设备中播放声音

swift - 映射 Documents 目录下的 mp3 并转换为 AVPlayerItems

iPhone ios 4 - 在播放背景音频流时替换 iPod 底座图标

Android 录制的 aac(.mp3) 文件无法在 iOS 中播放