Wie erkennen Sie, wenn einabgespielt wird ?. Zwischen dem Aufruf der Funktion play()
und der tatsächlichen Wiedergabe des Videos scheint eine leichte Verzögerung zu liegen.Erkennen, wenn AVPlayer abgespielt wird
Antwort
Soweit ich weiß, ich stimme mit Ihnen überein, dass es ist eine leichte Verzögerung zwischen dem, wenn die play()
Funktion aufgerufen wird und das Video tatsächlich spielt (In einem anderen Wort, die Zeit, die das erste Bild des Videos gerendert wurde). Die Verzögerung hängt von einigen Kriterien wie Videotypen (VOD oder Live-Streaming), dem Netzwerkzustand, ... ab. Glücklicherweise können wir jedoch immer wissen, wann das erste Bild des gerenderten Videos wiedergegeben wird .
Durch Beobachtung der status
der aktuellen AVPlayerItem
und wann immer es AVPlayerItemStatusReadyToPlay
ist, sollte das der erste Frame gerendert werden.
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:NULL];
-(void)observeValueForKeyPath:(NSString*)path ofObject:(id)object change:(NSDictionary*)change context:(void*) context {
if([self.playerItem status] == AVPlayerStatusReadyToPlay){
NSLog(@"The video actually plays")
}
}
By the way, es eine andere Lösung ist, wo wir readyForDisplay
Status AVPlayerLayer
beobachten, es zeigt auch, wenn das Video wiedergegeben. Allerdings hat diese Lösung den Nachteil, wie in Apple-Dokument erwähnt
/*!
@property readyForDisplay
@abstract Boolean indicating that the first video frame has been made ready for display for the current item of the associated AVPlayer.
@discusssion Use this property as an indicator of when best to show or animate-in an AVPlayerLayer into view.
An AVPlayerLayer may be displayed, or made visible, while this propoerty is NO, however the layer will not have any
user-visible content until the value becomes YES.
This property remains NO for an AVPlayer currentItem whose AVAsset contains no enabled video tracks.
*/
@property(nonatomic, readonly, getter=isReadyForDisplay) BOOL readyForDisplay;
Hier ist der Beispielcode
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
[self.playerLayer addObserver:self forKeyPath:@"readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:NULL];
-(void)observeValueForKeyPath:(NSString*)path ofObject:(id)object change:(NSDictionary*)change context:(void*) context {
if([self.playerLayer isReadyForDisplay]){
NSLog(@"Ready to display");
}
}
Thereotically, [self.playerLayer isReadyForDisplay]
zurückkehren sollte jedoch JA, wie das Dokument wird nicht garantiert.
Ich hoffe, das wäre hilfreich.
Für Video:
AVPlayer
haben ein Argument genannt rate (Float)
, wenn die rate
größer als 0,0 ist, gibt es ein Video, das zur Zeit zu spielen.
Sie können das überprüfen, ob die rate
ist !=0
: (die Rate negativ sein kann, wenn der Spieler nach hinten geht)
if vidPlayer != nil && vidPlayer.rate != 0 {
println("playing")
}
AVPlayer kann Video abspielen. Ich spreche nicht über AVAudioPlayer –
Ja. Ich habe die Antwort vor 12h bearbeitet und diesen Teil entfernt, wie zu @SohilR Empfehlung. Dachte es könnte es für andere Benutzer hilfreich sein. Der angegebene Code ist für AVPlayer und nicht für AVAudioPlayer. – Idan
Edited die Antwort zu klären. – Idan
Ich finde es sehr hilfreich. Ich benutze derzeit "self.player! .addBoundaryTimeObserverForTimes ([NSValue (CMTime: CMTimeMake (1, 20))], Warteschlange: nil, usingBlock: {()" und es wird nicht 100% der Zeit feuern, ich bin schaue mir gerade deine lösung an, gib mir eine stunde und ich werde updaten, wenn es funktioniert, danke! –
ich musste noch etwas hinzufügen, und das war test, wenn der status AVPlayerStatusReadyToPlay AND player.rate> 0 ist Stellen Sie sicher, dass der Player spielt, aber ansonsten perfekte Antwort –
@ JoshO'Connor großartig, das zu hören. Danke. – HDT