ホーム

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

2017年6月28日

 

動画の状態と、動画が終わったタイミングを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を使って動画を自動ループさせる

Pocket
LinkedIn にシェア

ご報告

off.tokyoは法人化しました、Web/Mobile コンサルティングのご相談なら、bid companyへお問い合わせください :)

ご提供 sponsor
 

Meee!(ミー)は、ビジネスからプライベート利用まで、個人のスキルを気軽に売り買いできるスキルマーケットです。カテゴリや居住地から、検索することが可能です。

 

ランゲージエクスチェンジは、ネイティブスピーカーと気軽にマッチングできる言語交換プラットフォームです。あなたの地元に住む外国人を探したり、留学や海外移住の前に、現地のネイティブスピーカーと繋がることもできます!

宣伝
 

りょすけトークchは、仕事や私生活をより豊にするYouTubeチャンネルです。文献(本、映画、論文)から役に立つ情報をまとめ、生涯にわたり役に立つ哲学をお届けしています。是非、チャンネル登録してみてね

  • この記事を書いた人

ryosuke-hujisawa

-ホーム

Copyright© offブログ!! , 2020 All Rights Reserved Powered by AFFINGER5.