Gibt es eine relativ einfache Möglichkeit, ein Video in AVFoundation zu schleifen?
Ich habe meinen AVPlayer und AVPlayerLayer folgendermaßen 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 mit:
[avPlayer play];
Das Video wird gut abgespielt, stoppt aber am Ende. Mit dem 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 fertig ist, damit ich zum Anfang suchen und ihn erneut abspielen kann.
Ich verwende MPMoviePlayerController nicht, da es einige schwerwiegende Einschränkungen gibt. Ich möchte mehrere Videostreams gleichzeitig wiedergeben können.
Antworten:
Sie können eine Benachrichtigung erhalten, wenn der Spieler endet. Prüfen
AVPlayerItemDidPlayToEndTimeNotification
Beim Einrichten des Players:
ObjC
Dadurch wird verhindert, dass der Spieler am Ende pausiert.
in der Benachrichtigung:
Dadurch wird der Film zurückgespult.
Vergessen Sie nicht, die Registrierung aufzuheben, wenn Sie den Player freigeben.
Schnell
Swift 4+
quelle
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
, wird es nicht aufhören, so dass Sie es nicht einstellen müssen, um erneut zu spielen[player play];
nach dem Zurückspulen anrufen .[[NSNotificationCenter defaultCenter] removeObserver:self];
beispielsweise verwenden, wennself
die Benachrichtigungen abgehört werden.Wenn es hilft, gibt es in iOS / tvOS 10 einen neuen AVPlayerLooper (), mit dem Sie nahtlose Video-Loops erstellen können (Swift):
Dies wurde auf der WWDC 2016 in "Fortschritte bei der AVFoundation-Wiedergabe" vorgestellt: https://developer.apple.com/videos/play/wwdc2016/503/
Selbst wenn ich diesen Code verwendete, hatte ich einen Schluckauf, bis ich einen Fehlerbericht bei Apple einreichte und die folgende Antwort erhielt:
Es stellte sich heraus, dass Premiere Dateien mit einer Audiospur exportiert hatte, die etwas anders lang war als das Video. In meinem Fall war es in Ordnung, das Audio vollständig zu entfernen, und das hat das Problem behoben.
quelle
In Swift :
Sie können eine Benachrichtigung erhalten, wenn der Player endet. Überprüfen Sie AVPlayerItemDidPlayToEndTimeNotification
beim Einrichten des Players:
Dadurch wird verhindert, dass der Spieler am Ende pausiert.
in der Benachrichtigung:
Swift3
Dadurch wird der Film zurückgespult.
Vergessen Sie nicht, die Registrierung aufzuheben, wenn Sie den Player freigeben.
quelle
Folgendes habe ich getan, um das Problem mit dem Pausenschluckauf zu vermeiden:
Schnell:
Ziel c:
HINWEIS: Ich habe es nicht verwendet,
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone
da es nicht benötigt wird.quelle
[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];
Zeilen zu tun - wenn ich diese Zeilen auskommentiere, gibt es keinen Speicherverlust mehr. Ich habe dies in Instrumenten profiliert.Ich empfehle die Verwendung von AVQueuePlayer, um Ihre Videos nahtlos zu schleifen. Fügen Sie den Benachrichtigungsbeobachter hinzu
und schleifen Sie in der Auswahl Ihr Video
quelle
Um die Lücke beim Zurückspulen des Videos zu vermeiden, hat es für mich gut funktioniert, mehrere Kopien desselben Assets in einer Komposition zu verwenden. Ich habe es hier gefunden:
www.developers-life.com/avplayer-looping-video-without-hiccupdelays.html(Link jetzt tot).quelle
Dies funktionierte bei mir ohne Probleme mit dem Schluckauf. Es geht darum, den Player anzuhalten, bevor die Methode seekToTime aufgerufen wird:
Init AVPlayer
Benachrichtigung registrieren
VideoLoop-Funktion
quelle
Für Swift 3 & 4
quelle
Meine Lösung in Ziel-c mit AVQueuePlayer - anscheinend müssen Sie das AVPlayerItem duplizieren und nach Abschluss der Wiedergabe des ersten Elements sofort eine weitere Kopie hinzufügen. "Art of" macht Sinn und funktioniert bei mir ohne Schluckauf
https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad
quelle
Swift 5:
Ich habe einige geringfügige Anpassungen gegenüber früheren Antworten vorgenommen, z. B. das Hinzufügen des playerItem zur Warteschlange, bevor es dem playerLayer hinzugefügt wird.
Und machen Sie playerLooper zu einer Eigenschaft Ihres UIViewControllers, da das Video sonst möglicherweise nur einmal abgespielt wird.
quelle
Nach dem Laden des Videos in den AVPlayer (natürlich über dessen AVPlayerItem):
Die Methode addDidPlayToEndTimeNotificationForPlayerItem:
In Ihrer viewWillDisappear-Methode:
In der Schnittstellendeklaration Ihres View Controllers in der Implementierungsdatei:
Müssen Sie dies betriebsbereit sehen, bevor Sie es versuchen? Laden Sie diese Beispiel-App herunter und führen Sie sie aus:
https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideo_ut__
In meiner App, die genau diesen Code verwendet, gibt es zwischen dem Ende des Videos und dem Anfang keinerlei Pause. Abhängig vom Video kann ich nicht feststellen, dass das Video wieder am Anfang steht. Speichern Sie die Timecode-Anzeige.
quelle
Sie können einen AVPlayerItemDidPlayToEndTimeNotification-Beobachter hinzufügen und das Video von Anfang an in der Auswahl wiedergeben, Code wie unten
quelle
Das Folgende funktioniert für mich in WKWebView in Swift 4.1. Der Hauptteil des WKWebView in WKwebviewConfiguration
quelle
Was ich getan habe, ist, es als Loop-Spiel zu machen, wie mein Code unten:
quelle
Swift 4.2 in Xcode 10.1.
Ja , es gibt eine relativ einfache Möglichkeit, ein Video einzuschleifen
AVKit
/AVFoundation
using zuAVQueuePlayer()
, Schlüsselwert Beobachtung (KVO) Technik und ein Token dafür.Dies funktioniert definitiv für eine Reihe von H.264 / HEVC-Videos mit einer minimalen Belastung für die CPU.
Hier ist ein Code:
quelle
Verwenden Sie den folgenden AVPlayerViewController-Code, der für mich funktioniert
Alle zu zeigenden Kontrollen, hoffe es ist hilfreich
quelle
Diese Eigenschaft ist bereits im Inneren definiert
AVAudioPlayer
. Hoffe das kann dir helfen. Ich benutze Xcode 6.3.quelle