多语言展示
当前在线:1667今日阅读:176今日分享:34

iOS Swift AVPlayer播放视频

在iOS下可以使用MPMediaPlayerViewController播放视频,但有时候需要更多的灵活和控制,这时候就不可避免地要使用AVPlayer了,本文介绍了AVPlayer的基本使用方法。
工具/原料
1

Xcode

2

Swift

方法/步骤
1

首先,AVPlayer本身是不可显示的,它必须附属于某个AVPlayerLayer才能显示出来。

2

import UIKitimport AVFoundationclass AVPlayerView: UIView {        var player : AVPlayer {                get {            let layer = self.layer as! AVPlayerLayer            return layer.player        }                set(newPlayer) {                        let layer = self.layer as! AVPlayerLayer            layer.player = newPlayer        }    }        override class func layerClass() -> AnyClass {        return AVPlayerLayer.self    } }

3

在storyboard中创建一个UIViewController,并将其view设置为AVPlayerView。

4

AVPlyer可以播放的当地和远程的视频,通常播放的元素称为AVPlayerItem。设置AVPlayerItem:        self.playerItem = AVPlayerItem(URL: url)        self.playerItem!.addObserver(self, forKeyPath: 'status', options: .New, context: &myContext)    // status        self.playerItem!.addObserver(self, forKeyPath: 'loadedTimeRanges', options:.New ,context: &myContext)                NSNotificationCenter.defaultCenter().addObserver(self, selector: 'myMovieFinishedCallback:', name: AVPlayerItemDidPlayToEndTimeNotification, object: self.playerItem)                self.playerView.player = AVPlayer(playerItem: playerItem)注意:这里对AVPlayerItem的状态,以前进程(progress)进行了监控,并监控视频结束广播消息。前两者是采用KVO的方式进行的。

5

当AVPlayerItem的状态和进程发生变化时,会接收到KVO事件。    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject: AnyObject], context: UnsafeMutablePointer) {                switch (keyPath, context) {            case ('status', &myContext):                let status = (change[NSKeyValueChangeNewKey] as! NSNumber).integerValue as AVPlayerStatus.RawValue                            switch (status) {                    case AVPlayerStatus.ReadyToPlay.rawValue:                        self.playerView.player.play()                                        case AVPlayerStatus.Failed.rawValue:                        println('Failed to load video')                                    default:                    true                }                        case ('loadedTimeRanges', &myContext):                            let timeInterval = availableDuration() // 计算缓冲进度                let duration = self.playerItem!.duration                let totalDuration = CMTimeGetSeconds(duration)                            println(timeInterval / totalDuration)                    default:            super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)        }    }在状态变成ReadyToPlay时开始进行播放。

推荐信息