動画の状態と、動画が終わったタイミングをKVOを使って監視してNotificationを使って状態の変更をキャッチして動画をループさせます。
環境
実装
import UIKit
import AVFoundation
class ViewController: UIViewController {
/*
動画を再生させる画面作る
*/
lazy var player: AVPlayer = {
var player: AVPlayer = AVPlayer(playerItem: self.playerItem)
player.actionAtItemEnd = AVPlayerActionAtItemEnd.none
return player
}()
lazy var playerItem: AVPlayerItem = {
var playerItem: AVPlayerItem = AVPlayerItem(asset: self.asset)
return playerItem
}()
lazy var asset: AVURLAsset = {
var asset: AVURLAsset = AVURLAsset(url: self.url)
asset.resourceLoader.setDelegate(self, queue: DispatchQueue.main)
return asset
}()
lazy var playerLayer: AVPlayerLayer = {
var playerLayer: AVPlayerLayer = AVPlayerLayer(player: self.player)
playerLayer.frame = UIScreen.main.bounds
playerLayer.backgroundColor = UIColor.clear.cgColor
return playerLayer
}()
/*
動画のURLを定義している
*/
var url: URL = {
var url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
return url!
}()
/*
viewDidLoad
*/
override func viewDidLoad() {
super.viewDidLoad()
//動画のアイテムを監視
playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil)
//動画が終わったタイミングを監視
NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
//画面、動画が現れる
view.layer.addSublayer(playerLayer)
//動画を再生
player.play()
}
// 監視対象の値に変化があった時に呼ばれる
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {}
//動画を一番最初まで巻き戻す的な
func playerItemDidReachEnd(_ notification: Notification) {
player.seek(to: kCMTimeZero)
}
}
//AVAssetResourceLoaderDelegate使わなきゃいけないから拡張
extension ViewController : AVAssetResourceLoaderDelegate {
}
参考
SwiftでKVOを試してみる
[Swift3.0] KVO(Key-Value Observing)による変数の監視
ソース
GitHub
NotificationとKVOを使って動画を自動ループさせる