Gibt es eine Möglichkeit festzustellen, ob eine AVPlayer
Wiedergabe ins Stocken geraten ist oder das Ende erreicht hat?
105
Gibt es eine Möglichkeit festzustellen, ob eine AVPlayer
Wiedergabe ins Stocken geraten ist oder das Ende erreicht hat?
So erhalten Sie eine Benachrichtigung zum Erreichen des Endes eines Artikels (über Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
Und um das Spielen zu verfolgen, können Sie:
"Verfolgen Sie Änderungen an der Position des Abspielkopfs in einem AVPlayer-Objekt" mithilfe von addPeriodicTimeObserverForInterval: queue: usingBlock: oder addBoundaryTimeObserverForTimes: queue: usingBlock : .
Beispiel ist von 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:
, und ihn nicht richtig handhaben. Eine zuverlässigere Möglichkeit für mich ist esAVPlayer
, den Status mithilfe von KVO zu verfolgen . Siehe meine Antwort unten für weitere Details: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Sie können sagen, dass es spielt mit:
Swift 3-Erweiterung:
quelle
- [AVPlayer setRate:-1.0]
), da-1.0
es kleiner als 0 ist.In iOS10 gibt es dafür jetzt eine integrierte Eigenschaft: timeControlStatus
Diese Funktion spielt beispielsweise den avPlayer basierend auf seinem Status ab oder hält ihn an und aktualisiert die Wiedergabe- / Pause-Taste entsprechend.
Was Ihre zweite Frage betrifft, um zu wissen, ob der avPlayer das Ende erreicht hat, ist es am einfachsten, eine Benachrichtigung einzurichten.
Wenn es zum Beispiel zu Ende ist, können Sie es zum Anfang des Videos zurückspulen lassen und die Pause-Taste auf Wiedergabe zurücksetzen.
Diese Beispiele sind nützlich, wenn Sie Ihre eigenen Steuerelemente erstellen. Wenn Sie jedoch einen AVPlayerViewController verwenden, sind die Steuerelemente integriert.
quelle
rate
Auf diese Weise können Sie NICHT überprüfen, ob ein Video abgespielt wird (es könnte ins Stocken geraten). Aus der Dokumentation vonrate
:Schlüsselwörter "Wunsch zu spielen" - eine Rate von
1.0
bedeutet nicht, dass das Video abgespielt wird.Die Lösung seit iOS 10.0 ist die Verwendung,
AVPlayerTimeControlStatus
die auf demAVPlayer
timeControlStatus
Grundstück beobachtet werden kann .Die Lösung vor iOS 10.0 (9.0, 8.0 usw.) besteht darin, eine eigene Lösung zu erstellen. Eine Rate von
0.0
bedeutet, dass das Video angehalten wird. Wennrate != 0.0
dies bedeutet, dass das Video entweder abgespielt wird oder blockiert ist.Sie können den Unterschied herausfinden, indem Sie die Spielerzeit beobachten über:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
Der Block gibt die aktuelle Spielerzeit in zurück
CMTime
, sodass ein Vergleich vonlastTime
(der Zeit, die zuletzt vom Block empfangen wurde) undcurrentTime
(der Zeit, die der Block gerade gemeldet hat) zeigt, ob der Spieler spielt oder blockiert ist. Wenn zum BeispiellastTime == currentTime
undrate != 0.0
, dann ist der Spieler ins Stocken geraten.Wie von anderen angemerkt, wird durch angezeigt, ob die Wiedergabe beendet ist
AVPlayerItemDidPlayToEndTimeNotification
.quelle
Eine zuverlässigere Alternative dazu
NSNotification
besteht darin, sich als Beobachter zumrate
Eigentum des Spielers hinzuzufügen .Überprüfen Sie dann, ob der neue Wert für die beobachtete Rate Null ist. Dies bedeutet, dass die Wiedergabe aus irgendeinem Grund gestoppt wurde, z. B. zum Erreichen des Endes oder zum Stillstand aufgrund eines leeren Puffers.
Um
rate == 0.0
genau zu wissen, warum die Wiedergabe gestoppt wurde, können Sie die folgenden Überprüfungen durchführen:Und vergessen Sie nicht, Ihren Spieler anzuhalten, wenn er das Ende erreicht:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
quelle
AVPlayerItemFailedToPlayToEndTimeNotification
. Wenn dieser Fehler auftritt, wird die Endzeit nie erreicht. Oder lesen Sie die Antwort von maz und fügen Sie Ihrem Code eine Prüfung hinzuplayer.error != nil
. In diesem Fall wurde die Wiedergabe aufgrund eines Fehlers "beendet".AVPlayerItemDidPlayToEndTimeNotification
?Für Swift :
AVPlayer :
Update :
player.rate > 0
Bedingung geändert in,player.rate != 0
da wenn Video in umgekehrter Reihenfolge abgespielt wird, es dank Julian für den Hinweis negativ sein kann.Hinweis : Dies könnte wie die obige Antwort von (Maz) aussehen, aber in Swift gab '! Player.error' einen Compilerfehler aus, sodass Sie in Swift mit 'player.error == nil' nach Fehlern suchen müssen (wegen der Fehlereigenschaft) ist nicht vom Typ 'Bool')
AVAudioPlayer:
AVQueuePlayer:
quelle
player.rate = -1.0
), da -1,0 kleiner als 0 ist.Schnelle Erweiterung basierend auf der Antwort von Maz
quelle
Die Swift-Version von maxkonovalovs Antwort lautet:
und
Vielen Dank, dass Sie maxkonovalov!
quelle
nil
! Aber ich muss wissen, wann die Ansicht beginnt (nicht endet). Wie geht das?Derzeit ist mit Swift 5 der einfachste Weg, um zu überprüfen, ob der Player spielt oder angehalten ist, die Überprüfung der Variablen .timeControlStatus .
quelle
quelle
quelle