Есть ли способ узнать, AVPlayer
остановилось ли воспроизведение или дошло до конца?
106
Есть ли способ узнать, AVPlayer
остановилось ли воспроизведение или дошло до конца?
Чтобы получить уведомление о достижении конца элемента (через Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
А отслеживать игру вы можете:
«отслеживать изменения положения курсора воспроизведения в объекте AVPlayer» с помощью addPeriodicTimeObserverForInterval: queue: usingBlock: или addBoundaryTimeObserverForTimes: queue: usingBlock: .
Пример от Apple:
// Assume a property: @property (retain) id playerObserver;
Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime firstThird = CMTimeMakeWithSeconds(durationSeconds/3.0, 1);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:firstThird], [NSValue valueWithCMTime:secondThird], nil];
self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
// Passing NULL for the queue specifies the main queue.
NSString *timeDescription = (NSString *)CMTimeCopyDescription(NULL, [self.player currentTime]);
NSLog(@"Passed a boundary at %@", timeDescription);
[timeDescription release];
}];
-replaceCurrentItemWithPlayerItem:
, и не обработаете его должным образом. Для меня более надежный способ - отслеживатьAVPlayer
статус с помощью KVO. Подробнее см. Мой ответ ниже: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Вы можете сказать, что он играет, используя:
Расширение Swift 3:
источник
- [AVPlayer setRate:-1.0]
), потому что-1.0
оно меньше 0.В iOS10 для этого теперь есть встроенное свойство: timeControlStatus
Например, эта функция воспроизводит или приостанавливает avPlayer в зависимости от его статуса и соответствующим образом обновляет кнопку воспроизведения / паузы.
Что касается вашего второго вопроса, чтобы узнать, достиг ли avPlayer конца, проще всего настроить уведомление.
Например, когда он дойдет до конца, вы можете перемотать его на начало видео и сбросить кнопку «Пауза» на «Воспроизведение».
Эти примеры полезны, если вы создаете свои собственные элементы управления, но если вы используете AVPlayerViewController, элементы управления будут встроены.
источник
rate
это НЕ способ , чтобы проверить , является ли видео воспроизведения (он может приостанавливаться). Из документацииrate
:Ключевые слова «желание играть» - скорость
1.0
не означает, что видео проигрывается.Решение, начиная с iOS 10.0, заключается в использовании,
AVPlayerTimeControlStatus
которое можно увидеть на сайтеAVPlayer
timeControlStatus
.Решение до iOS 10.0 (9.0, 8.0 и т. Д.) Состоит в том, чтобы развернуть собственное решение. Скорость
0.0
означает, что воспроизведение видео приостановлено. Когдаrate != 0.0
это означает, что видео либо воспроизводится, либо застопорилось.Вы можете узнать разницу, наблюдая за временем игрока:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
Блок возвращает текущее время игрока
CMTime
, поэтому сравнениеlastTime
(время, которое было в последний раз получено от блока) иcurrentTime
(время, которое только что сообщил блок) покажет, играет ли игрок или остановился. Например, еслиlastTime == currentTime
иrate != 0.0
, то игрок остановился.Как отмечали другие, выяснение того, закончилось ли воспроизведение, обозначается значком
AVPlayerItemDidPlayToEndTimeNotification
.источник
Более надежная альтернатива
NSNotification
- добавить себя в качестве наблюдателя кrate
собственности игрока .Затем проверьте, равно ли новое значение наблюдаемой скорости нулю, что означает, что воспроизведение остановлено по какой-то причине, например, по достижении конца или остановке из-за пустого буфера.
На
rate == 0.0
всякий случай, чтобы узнать, что именно вызвало остановку воспроизведения, вы можете выполнить следующие проверки:И не забудьте остановить игрока, когда он доходит до конца:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
источник
AVPlayerItemFailedToPlayToEndTimeNotification
. Если эта ошибка произойдет, никогда не дойдет до конца времени. Или, прочитав ответ maz, добавьте в свой код проверкуplayer.error != nil
, и в этом случае воспроизведение "закончилось" из-за ошибки.AVPlayerItemDidPlayToEndTimeNotification
?Для Swift :
AVPlayer :
Обновление :
player.rate > 0
условие изменено на,player.rate != 0
потому что, если видео воспроизводится в обратном направлении, оно может быть отрицательным, спасибо Джулиану за указание.Примечание : это может выглядеть так же, как и ответ выше (Maz), но в Swift '! Player.error' выдавал мне ошибку компилятора, поэтому вам нужно проверить наличие ошибки, используя 'player.error == nil' в Swift. (Потому что свойство error не относится к типу Bool)
AVAudioPlayer:
AVQueuePlayer:
источник
player.rate = -1.0
), потому что -1,0 меньше 0.Расширение Swift на основе ответа maz
источник
Swift-версия ответа maxkonovalov такова:
и
Спасибо максконовалов!
источник
nil
! Но мне нужно знать, когда просмотр начинается (а не заканчивается). Как это сделать?В настоящее время в Swift 5 самый простой способ проверить, играет ли игрок или приостановлен, - это проверить переменную .timeControlStatus .
источник
источник
источник