[FIXED] Ein Video mit AVFoundation AVPlayer wiederholen?

Ausgabe

Gibt es eine relativ einfache Möglichkeit, ein Video in AVFoundation zu loopen?

Ich habe meinen AVPlayer und AVPlayerLayer wie folgt erstellt:

avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];

avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];

und dann spiele ich mein Video ab mit:

[avPlayer play];

Das Video wird gut abgespielt, bricht aber am Ende ab. Beim MPMoviePlayerController müssen Sie lediglich seine repeatModeEigenschaft auf den richtigen Wert setzen. Auf AVPlayer scheint es keine ähnliche Eigenschaft zu geben. Es scheint auch keinen Rückruf zu geben, der mir sagt, wann der Film zu Ende ist, damit ich zum Anfang suchen und ihn erneut abspielen kann.

Ich verwende MPMoviePlayerController nicht, weil es einige ernsthafte Einschränkungen hat. Ich möchte mehrere Videostreams gleichzeitig wiedergeben können.

Lösung

Sie können eine Benachrichtigung erhalten, wenn der Player endet. PrüfenAVPlayerItemDidPlayToEndTimeNotification

Beim Einrichten des Players:

ObjC

  avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(playerItemDidReachEnd:)
                                               name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:[avPlayer currentItem]];

Dadurch wird verhindert, dass der Player am Ende pausiert.

in der benachrichtigung:

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    AVPlayerItem *p = [notification object];
    [p seekToTime:kCMTimeZero];
}

Dadurch wird der Film zurückgespult.

Vergessen Sie nicht, die Benachrichtigung beim Freigeben des Players abzumelden.

Schnell

avPlayer?.actionAtItemEnd = .none

NotificationCenter.default.addObserver(self,
                                       selector: #selector(playerItemDidReachEnd(notification:)),
                                       name: .AVPlayerItemDidPlayToEndTime,
                                       object: avPlayer?.currentItem)

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: kCMTimeZero)
    }
}

Schnell 4+

@objc func playerItemDidReachEnd(notification: Notification) {
    if let playerItem = notification.object as? AVPlayerItem {
        playerItem.seek(to: CMTime.zero, completionHandler: nil)
    }
}


Beantwortet von –
Bastian


Antwort geprüft von –
Senaida (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like