006 動画の再生

Swift3.0に対応した新サイトオープンしました。

http://docs.fabo.io/swift/


Preview



Source

ViewController.Swift

//

//  ViewController.swift

//  AVFoundation006

//


import UIKit

import AVFoundation

import CoreMedia


class ViewController: UIViewController {

    

    // 再生用のアイテム.

    var playerItem : AVPlayerItem!

    

    // AVPlayer.

    var videoPlayer : AVPlayer!

    

    // シークバー.

    var seekBar : UISlider!

    

    override func viewDidLoad() {

        

        // パスからassetを生成.

        let path = NSBundle.mainBundle().pathForResource("test", ofType: "mov")

        let fileURL = NSURL(fileURLWithPath: path!)

        let avAsset = AVURLAsset(URL: fileURL, options: nil)

        

        // AVPlayerに再生させるアイテムを生成.

        playerItem = AVPlayerItem(asset: avAsset)

        

        // AVPlayerを生成.

        videoPlayer = AVPlayer(playerItem: playerItem)

        

        // Viewを生成.

        let videoPlayerView = AVPlayerView(frame: self.view.bounds)

        

        // UIViewのレイヤーをAVPlayerLayerにする.

        let layer = videoPlayerView.layer as! AVPlayerLayer

        layer.videoGravity = AVLayerVideoGravityResizeAspect

        layer.player = videoPlayer

        

        // レイヤーを追加する.

        self.view.layer.addSublayer(layer)

        

        // 動画のシークバーとなるUISliderを生成.

        seekBar = UISlider(frame: CGRectMake(0, 0, self.view.bounds.maxX - 100, 50))

        seekBar.layer.position = CGPointMake(self.view.bounds.midX, self.view.bounds.maxY - 100)

        seekBar.minimumValue = 0

        seekBar.maximumValue = Float(CMTimeGetSeconds(avAsset.duration))

        seekBar.addTarget(self, action: "onSliderValueChange:", forControlEvents: UIControlEvents.ValueChanged)

        self.view.addSubview(seekBar)

        

        

        /* 

        シークバーを動画とシンクロさせる為の処理.

        */

        

        // 0.5分割で動かす事が出来る様にインターバルを指定.

        let interval : Double = Double(0.5 * seekBar.maximumValue) / Double(seekBar.bounds.maxX)

        

        // CMTimeに変換する.

        let time : CMTime = CMTimeMakeWithSeconds(interval, Int32(NSEC_PER_SEC))

        

        // time毎に呼び出される.

        videoPlayer.addPeriodicTimeObserverForInterval(time, queue: nil) { (time) -> Void in

            

            // 総再生時間を取得.

            let duration = CMTimeGetSeconds(self.videoPlayer.currentItem.duration)

            

            // 現在の時間を取得.

            let time = CMTimeGetSeconds(self.videoPlayer.currentTime())

            

            // シークバーの位置を変更.

            let value = Float(self.seekBar.maximumValue - self.seekBar.minimumValue) * Float(time) / Float(duration) + Float(self.seekBar.minimumValue)

            self.seekBar.value = value

        }

        

        // 動画の再生ボタンを生成.

        let startButton = UIButton(frame: CGRectMake(0, 0, 50, 50))

        startButton.layer.position = CGPointMake(self.view.bounds.midX, self.view.bounds.maxY - 50)

        startButton.layer.masksToBounds = true

        startButton.layer.cornerRadius = 20.0

        startButton.backgroundColor = UIColor.orangeColor()

        startButton.setTitle("Start", forState: UIControlState.Normal)

        startButton.addTarget(self, action: "onButtonClick:", forControlEvents: UIControlEvents.TouchUpInside)

        self.view.addSubview(startButton)

    }

    

    // 再生ボタンが押された時に呼ばれるメソッド.

    func onButtonClick(sender : UIButton){

        

        // 再生時間を最初に戻して再生.

        videoPlayer.seekToTime(CMTimeMakeWithSeconds(0, Int32(NSEC_PER_SEC)))

        videoPlayer.play()

        

    }

    

    // シークバーの値が変わった時に呼ばれるメソッド.

    func onSliderValueChange(sender : UISlider){

        

        // 動画の再生時間をシークバーとシンクロさせる.

        videoPlayer.seekToTime(CMTimeMakeWithSeconds(Float64(seekBar.value), Int32(NSEC_PER_SEC)))

        

    }

}

AVPlayerView.swift

//

//  ViewController.swift

//  AVFoundation006

//


import AVFoundation

import UIKit


// レイヤーをAVPlayerLayerにする為のラッパークラス.

class AVPlayerView : UIView{

    

    required init(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)

    }

    

    override init(frame: CGRect) {

        super.init(frame: frame)

    }

    

    override class func layerClass() -> AnyClass{

        return AVPlayerLayer.self

    }

    

}


Reference

    CoreMedia Framework

    AVPlayerItem Class

    AVPlayer Class

    AVPlayerLayerView(Sample Code) 

     


č
test.mov
(7879k)
ユーザー不明,
2015/05/18 2:27
Comments