4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NotificationとKVOを使って動画を自動ループ

Posted at

動画の状態と、動画が終わったタイミングをKVOを使って監視してNotificationを使って状態の変更をキャッチして動画をループさせます。

環境

  • Xcode8
  • Swift3

実装


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を使って動画を自動ループさせる

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?