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 repeatMode
Eigenschaft 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)