14.Swift 播放音频

14.Swift 播放音频

  • Swift 播放音频
    • AVPlayer
    • AVAudioPlayer
    • MPMoviePlayerViewController
    • AVPlayerViewController


Swift中的播放音频功能实现,可以使用AVPlayerAVAudioPlayer ;也有两个封装好的Controller可以播放音频,分别是MPMoviePlayerViewController和者AVPlayerViewController

两者的区别只有一点,MPMoviePlayerViewController在IOS9.0后被弃用了。若你调用该API的话,你会看到如下警告:

‘MPMoviePlayerViewController’ was deprecated in iOS 9.0: Use AVPlayerViewController in AVKit.

上述的警告,告诉我们:在IOS9.0以后,MPMoviePlayerViewController就被废弃了,推荐我们使用AVKit中的AVPlayerViewController。当然目前不是完全废弃,还是能调用MPMoviePlayerViewController。


AVPlayer

AVPlayer构造方法
AVPlayer.init(URL: NSURL)

播放
AVPlayer.play()

暂停
AVPlayer.pause()

注意:AVPlayer是没有停止方法的播放器,可以通过逻辑处理;先将AVPlayer暂停,然后设置为nil即可。但是这样的话,每次播放前都必须进行是否为nil的判断

    var avPlayer:AVPlayer!

    // 实例化AVPlayer
    func initAVPlayer(){
        self.avPlayer = AVPlayer(URL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("aLIEz", ofType: "mp3")!))
    }

    // 开始
    @IBAction func avPlayerStart(sender: AnyObject) {
        // 判断AVPlayer是否为空
        if let player = self.avPlayer{
            player.play()
        }else{
            // 为空则重新实例化
            self.initAVPlayer()
            self.avPlayer.play()
        }

    }

    // 暂停
    @IBAction func avPlayerPause(sender: AnyObject) {
        self.avPlayer.pause()
    }

    // 停止
    @IBAction func avPlayerStop(sender: AnyObject) {
        // AVPlayer没有stop的方法,所以只能先暂停,再清空
        self.avPlayer.pause()
        self.avPlayer = nil
    }

AVAudioPlayer

AVAudioPlayer构造方法
AVAudioPlayer.init(contentsOfURL url: NSURL) throws

播放
AVAudioPlayer.play() -> Bool

暂停
AVAudioPlayer.pause()

停止。实际上,真的并没有用
AVAudioPlayer.stop()

AVAudioPlayer播放音频的当前时间,用于和stop()一起调用,实现真正的停止
AVAudioPlayer.currentTime: NSTimeInterval

    var avAudioPlayer:AVAudioPlayer!

    // 实例化avAudioPlayer
    func initAVAudioPlayer(){
        do{
            try self.avAudioPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("aLIEz", ofType: "mp3")!))
        }catch let error as NSError{
            print(error.localizedDescription)
        }
    }

    // 播放
    @IBAction func avAudioPlayerStart(sender: AnyObject) {
        self.avAudioPlayer.play()
    }

    // 暂停
    @IBAction func avAudioPlayerPause(sender: AnyObject) {
        self.avAudioPlayer.pause()
    }

    // 停止
    @IBAction func avAudioPlayerStop(sender: AnyObject) {
        self.avAudioPlayer.stop()
        // 如果当前时间不设置为0,那么停止将毫无意义
        self.avAudioPlayer.currentTime = 0
    }

MPMoviePlayerViewController

官方不推荐使用了,因为IOS9.0以后将要废弃

    // MPMoviePlayerViewController播放音频
    func playMPMoviePlayerViewController(){
        // 实例化MPMoviePlayerViewController
        let mpMPVC:MPMoviePlayerViewController = MPMoviePlayerViewController(contentURL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("aLIEz", ofType: "mp3")!))
        // Controller的跳转
        self.presentViewController(mpMPVC, animated: true) { () -> Void in
            // 调用MPMoviePlayerViewController里的moviePlayer播放音频
            mpMPVC.moviePlayer.play()
        }
    }

AVPlayerViewController

这个的话,实质上是内部嵌套了一个AVPlayer的官方Controller

官方不推荐使用MPMoviePlayerViewController,并且IOS9.0以后将要废弃,是因为要主推AVPlayerViewController

AVPlayerViewController的设计还是非常合理的,将分离了播放器出来,大大降低了播放代码的耦合度。

怎么降低了耦合度?

MPMoviePlayerController.moviePlayer: MPMoviePlayerController! { get }

AVPlayerViewController.player: AVPlayer?

对比两个提供给我们调用play的对象,一个是Controller,一个是AVPlayer。也就是说MPMoviePlayerController调用的是自身去播放,而AVPlayerViewController调用的是自己内部的AVPlayer去播放。假如要在播放流程上设计各种花式的需求,MPMoviePlayerController去实现的话,就要写一个自定义的MPMoviePlayerController子类去覆写其的播放逻辑方法;而AVPlayerViewController的话,只需要自定义一个AVPlayer子类,然后给AVPlayerViewController中的player属性添加一个引用而已,这样的解耦,完全脱离了Controller,无论播放逻辑再复杂,也不影响到AVPlayerViewController

    // AVPlayerViewController播放音频
    func playAVPlayerViewController(){
        // 实例化AVPlayerViewController
        let AVVC:AVPlayerViewController = AVPlayerViewController()
        // 实例化AVPlayer
        let avPlayer:AVPlayer = AVPlayer(URL: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("aLIEz", ofType: "mp3")!))
        // 添加AVPlayerViewController里的AVPlayer
        AVVC.player = avPlayer
        // Controller的跳转
        self.presentViewController(AVVC, animated: true) { () -> Void in
            // 调用AVPlayerViewController里的AVPlayer播放音频
            AVVC.player?.play()
        }
    }

你可能感兴趣的:(Swift,Swift,Life)