Czy istnieje sposób, aby dowiedzieć się, czy AVPlayer
odtwarzanie utknęło w martwym punkcie lub dobiegło końca?
106
Czy istnieje sposób, aby dowiedzieć się, czy AVPlayer
odtwarzanie utknęło w martwym punkcie lub dobiegło końca?
Aby otrzymać powiadomienie o osiągnięciu końca elementu (przez Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
Aby śledzić odtwarzanie, możesz:
„śledzenia zmian w położeniu wskaźnika odtwarzania na przedmiocie AVPlayer” stosując addPeriodicTimeObserverForInterval: kolejki: usingBlock: lub addBoundaryTimeObserverForTimes: kolejki: usingBlock: .
Przykład pochodzi od 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:
, i nie obsłużysz go poprawnie. Bardziej niezawodnym sposobem jest dla mnie śledzenieAVPlayer
statusu za pomocą KVO. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Możesz powiedzieć, że gra za pomocą:
Rozszerzenie Swift 3:
źródło
- [AVPlayer setRate:-1.0]
), ponieważ-1.0
jest mniejsze niż 0.W iOS10 dostępna jest teraz wbudowana właściwość: timeControlStatus
Na przykład ta funkcja odtwarza lub wstrzymuje avPlayer na podstawie jego statusu i odpowiednio aktualizuje przycisk odtwarzania / pauzy.
Jeśli chodzi o drugie pytanie, aby wiedzieć, czy avPlayer dobiegł końca, najłatwiej byłoby skonfigurować powiadomienie.
Na przykład, gdy dojdzie do końca, możesz przewinąć go do początku wideo i zresetować przycisk Wstrzymaj do odtwarzania.
Te przykłady są przydatne, jeśli tworzysz własne kontrolki, ale jeśli używasz AVPlayerViewController, kontrolki są wbudowane.
źródło
rate
NIE jest sposobem na sprawdzenie, czy wideo jest odtwarzane (może się zawiesić). Z dokumentacjirate
:Słowa kluczowe „chęć zabawy” - stawka
1.0
nie oznacza, że wideo jest odtwarzane.Rozwiązaniem od iOS 10.0 jest użycie,
AVPlayerTimeControlStatus
które można obserwować naAVPlayer
timeControlStatus
właściwości.Rozwiązaniem wcześniejszym niż iOS 10.0 (9.0, 8.0 itd.) Jest wprowadzenie własnego rozwiązania. Stawka
0.0
oznacza, że wideo jest wstrzymane. Gdyrate != 0.0
oznacza to, że wideo jest odtwarzane lub utknęło.Możesz poznać różnicę, obserwując czas gracza poprzez:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
Blok zwraca aktualny czas gracza
CMTime
, więc porównanielastTime
(czasu, który został ostatnio odebrany z bloku) icurrentTime
(czasu, w którym właśnie został zgłoszony blok) pokaże, czy gracz gra, czy jest zatrzymany. Na przykład, jeślilastTime == currentTime
irate != 0.0
, to gracz utknął w martwym punkcie.Jak zauważyli inni, ustalenie, czy odtwarzanie zostało zakończone, jest oznaczone ikoną
AVPlayerItemDidPlayToEndTimeNotification
.źródło
Bardziej niezawodną alternatywą
NSNotification
jest dodanie siebie jako obserwatora dorate
własności gracza .Następnie sprawdź, czy nowa wartość obserwowanej szybkości wynosi zero, co oznacza, że odtwarzanie zostało zatrzymane z jakiegoś powodu, na przykład do końca lub zatrzymania z powodu pustego bufora.
Na
rate == 0.0
przykład, aby wiedzieć, co dokładnie spowodowało zatrzymanie odtwarzania, możesz wykonać następujące czynności:I nie zapomnij zatrzymać odtwarzacza, gdy dotrze do końca:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
źródło
AVPlayerItemFailedToPlayToEndTimeNotification
. Jeśli wystąpi ten błąd, nigdy nie dotrze do czasu zakończenia. Lub czytając odpowiedź maz, dodaj do swojego kodu czekplayer.error != nil
, w którym to przypadku odtwarzanie „zakończyło się” z powodu błędu.AVPlayerItemDidPlayToEndTimeNotification
?Dla Swift :
AVPlayer :
Aktualizacja :
player.rate > 0
stan zmieniony na,player.rate != 0
ponieważ jeśli wideo jest odtwarzane w odwrotnej kolejności, może to być negatywne dzięki Julianowi za wskazanie.Uwaga : To może wyglądać tak samo, jak powyższa odpowiedź (Maz), ale w języku Swift '! Player.error' dawał mi błąd kompilatora, więc musisz sprawdzić błąd za pomocą 'player.error == nil' w Swift. (Ponieważ właściwość błędu nie jest typu „Bool”)
AVAudioPlayer:
AVQueuePlayer:
źródło
player.rate = -1.0
), ponieważ -1.0 jest mniejsze niż 0.Szybkie rozszerzenie na podstawie odpowiedzi maz
źródło
Szybka wersja odpowiedzi maxkonovalova jest następująca:
i
Dziękuję maxkonovalov!
źródło
nil
! Ale muszę wiedzieć, kiedy widok się zaczyna (a nie kończy). Jakiś sposób to zrobić?Obecnie w Swift 5 najłatwiejszym sposobem sprawdzenia, czy odtwarzacz jest odtwarzany lub wstrzymany, jest sprawdzenie zmiennej .timeControlStatus .
źródło
źródło
źródło