Swift中的播放音频功能实现,可以使用AVPlayer
和AVAudioPlayer
;也有两个封装好的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.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.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
}
官方不推荐使用了,因为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()
}
}
这个的话,实质上是内部嵌套了一个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()
}
}