Existe-t-il un moyen relativement simple de boucler une vidéo dans AVFoundation?
J'ai créé mon AVPlayer et AVPlayerLayer comme ceci:
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];
avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];
puis je joue ma vidéo avec:
[avPlayer play];
La vidéo est bien lue mais s'arrête à la fin. Avec MPMoviePlayerController, tout ce que vous avez à faire est de définir sa repeatMode
propriété sur la bonne valeur. Il ne semble pas y avoir de propriété similaire sur AVPlayer. Il ne semble pas non plus y avoir de rappel qui me dira quand le film est terminé pour que je puisse chercher au début et le rejouer.
Je n'utilise pas MPMoviePlayerController car il présente de sérieuses limitations. Je souhaite pouvoir lire plusieurs flux vidéo à la fois.
Réponses:
Vous pouvez recevoir une notification lorsque le joueur se termine. Vérifier
AVPlayerItemDidPlayToEndTimeNotification
Lors de la configuration du lecteur:
ObjC
cela empêchera le lecteur de faire une pause à la fin.
dans la notification:
cela rembobinera le film.
N'oubliez pas de désenregistrer la notification lors de la libération du lecteur.
Rapide
Swift 4+
la source
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
cela ne s'arrêtera pas, donc pas besoin de le remettre en jeu[player play];
après le rembobinage.[[NSNotificationCenter defaultCenter] removeObserver:self];
par exemple, quandself
écoute les notifications.Si cela vous aide, dans iOS / tvOS 10, il existe un nouvel AVPlayerLooper () que vous pouvez utiliser pour créer une boucle transparente de la vidéo (Swift):
Cela a été présenté à la WWDC 2016 dans "Advances in AVFoundation Playback": https://developer.apple.com/videos/play/wwdc2016/503/
Même en utilisant ce code, j'ai eu un hoquet jusqu'à ce que je dépose un rapport de bogue avec Apple et que j'obtienne cette réponse:
Il s'avère que Premiere exportait des fichiers avec une piste audio d'une longueur légèrement différente de celle de la vidéo. Dans mon cas, il était bien de supprimer complètement l'audio, et cela a résolu le problème.
la source
Dans Swift :
Vous pouvez obtenir une notification lorsque le lecteur se termine ... vérifiez AVPlayerItemDidPlayToEndTimeNotification
lors de la configuration du lecteur:
cela empêchera le lecteur de faire une pause à la fin.
dans la notification:
Swift3
cela rembobinera le film.
N'oubliez pas de désenregistrer la notification lors de la libération du lecteur.
la source
Voici ce que j'ai fini par faire pour éviter le problème de pause-hoquet:
Rapide:
Objectif c:
REMARQUE: je n'ai pas utilisé
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone
car ce n'est pas nécessaire.la source
[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];
lignes - lorsque je commente ces lignes, il n'y a plus de fuite de mémoire. J'ai profilé cela dans les instruments.Je recommande d'utiliser AVQueuePlayer pour boucler vos vidéos de manière transparente. Ajouter l'observateur de notification
et dans son sélecteur, bouclez votre vidéo
la source
Pour éviter l'écart lorsque la vidéo est rembobinée, l'utilisation de plusieurs copies du même élément dans une composition a bien fonctionné pour moi. Je l'ai trouvé ici:
www.developers-life.com/avplayer-looping-video-without-hiccupdelays.html(lien maintenant mort).la source
cela a fonctionné pour moi sans problème de hoquet, le point est de mettre le lecteur en pause avant d'appeler la méthode seekToTime:
init AVPlayer
enregistrement de la notification
fonction videoLoop
la source
Pour Swift 3 & 4
la source
ma solution en objective-c avec AVQueuePlayer - il semble que vous deviez dupliquer l'AVPlayerItem et à la fin de la lecture du premier élément, ajoutez instantanément une autre copie. "Kind of" a du sens et fonctionne pour moi sans aucun hoquet
https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad
la source
Swift 5:
J'ai fait quelques légers ajustements par rapport aux réponses précédentes, comme l'ajout du playerItem à la file d'attente avant de l'ajouter au playerLayer.
Et faites de playerLooper une propriété de votre UIViewController, sinon la vidéo ne peut être lue qu'une seule fois.
la source
Après avoir chargé la vidéo dans l'AVPlayer (via son AVPlayerItem, bien sûr):
La méthode addDidPlayToEndTimeNotificationForPlayerItem:
Dans votre méthode viewWillDisappear:
Dans la déclaration d'interface de votre contrôleur de vue dans le fichier d'implémentation:
Besoin de voir cela opérationnel avant d'essayer? Téléchargez et exécutez cet exemple d'application:
https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_Output_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_Output_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_French_IDController8D
Dans mon application, qui utilise ce code même, il n'y a aucune pause entre la fin de la vidéo et le début. En fait, en fonction de la vidéo, il n'y a aucun moyen pour moi de dire que la vidéo est à nouveau au début, enregistrez l'affichage du code temporel.
la source
vous pouvez ajouter un observateur AVPlayerItemDidPlayToEndTimeNotification et rejouer la vidéo depuis le début dans le sélecteur, code comme ci-dessous
la source
Ce qui suit fonctionne pour moi dans WKWebView dans swift 4.1 La partie principale de WKWebView dans WKwebviewConfiguration
la source
Ce que j'ai fait, c'est de le faire jouer en boucle, comme mon code ci-dessous:
la source
Swift 4.2 dans Xcode 10.1.
Oui , il existe un moyen relativement simple de mettre en boucle une vidéo dans
AVKit
/ enAVFoundation
utilisant laAVQueuePlayer()
technique d'observation de la valeur clé (KVO) et un jeton pour cela.Cela fonctionne certainement pour un tas de vidéos H.264 / HEVC avec une charge minimale pour le processeur.
Voici un code:
la source
utilisez AVPlayerViewController ci-dessous le code, cela fonctionne pour moi
Tous les contrôles à montrer, j'espère que c'est utile
la source
Cette propriété est déjà définie à l'intérieur
AVAudioPlayer
. J'espère que cela peut vous aider. J'utilise Xcode 6.3.la source