AVPlayer seekToTime: допуск: до: толерантность после зависает с перерывами

Я звоню AVPlayer seekToTime:toleranceBefore:toleranceAfter который прерывается, не завершается (блок завершения даже не вызывается). Я посмотрел на другой стека overflow, но безуспешно.

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

Кто-нибудь сталкивался с этой проблемой?

2 ответа

Технические вопросы и ответы QA1820 Как добиться плавной очистки видео с помощью AVPlayer seekToTime:?

В: Мое приложение позволяет пользователю очищать видеофайлы с помощью ползункового регулятора в сочетании с AVPlayer seekToTime: но при отображении видеокадров наблюдается значительная задержка. Как я могу добиться более гладкой очистки?

A: Избегайте звонков в AVPlayer seekToTime: в быстрой последовательности. Это отменит текущие поиски, что приведет к большому количеству поисков и небольшому отображению целевых кадров. Вместо этого используйте вариант обработчика завершения AVPlayer seekToTime: и дождитесь завершения выполнения поиска, прежде чем выдать другой. В листинге 1 и листинге 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

Пытаться -seekToDate:completionHandler: метод. Это так же, как toleranceBefore:toleranceAfter с помощью kCMTimeZero. Если это не поможет, предоставьте больше деталей.

Другие вопросы по тегам