Технические данные 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