14.Swift 播放音频

来源:互联网 发布:劫持域名如何处理 编辑:程序博客网 时间:2024/06/05 16:34

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()        }    }
0 1
原创粉丝点击