2015-05-08 2 views
2

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

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

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

ответ

0

Try -seekToDate:completionHandler: способ. Это то же самое, что и toleranceBefore:toleranceAfter с kCMTimeZero. Если это не поможет предоставить более подробную информацию.

1

Технические данные Q & A 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 
Смежные вопросы