过去我们可以使用 Media Player 框架 MPMoviePlayerController 来播放视频、音频。但自 iOS9.0 起,这个便被废除。取而代之的便是 AVFoundation 框架的 AVPlayer。
过去我们可以使用 Media Player 框架 MPMoviePlayerController 来播放视频、音频。但自 iOS9.0 起,这个便被废除。取而代之的便是 AVFoundation 框架的 AVPlayer。
1,AVPlayer介绍
- (1)AVPlayer 可以用来播放视频,也可以播放任何 iOS 支持的音频。
- (2)AVPlayer 既可以播放本地音频,可以播放网络音频(在线音频)。
- (3)要注意的是,如果播放远程音频,AVPlayer 同样是全部加载到本地后才开始播放,而不是以流媒体的形式播放。
2,效果图
- (1)下面使用 AVPlayer 制作一个音乐播放器。
- (2)点击按钮可以时音乐在“播放”和“暂停”两个状态间切换。
- (3)播放过程中进度条和旁边的标签会实时显示当前的进度。
- (4)进度条滑块可以自由拖动,并播放对应时间点的音乐。
3,样例代码
import UIKit import AVFoundation class ViewController: UIViewController { //播放按钮 @IBOutlet weak var playButton: UIButton! //可拖动的进度条 @IBOutlet weak var playbackSlider: UISlider! //当前播放时间标签 @IBOutlet weak var playTime: UILabel! //播放器相关 var playerItem:AVPlayerItem? var player:AVPlayer? override func viewDidLoad() { super.viewDidLoad() //初始化播放器 let url = URL(string: "http://www.hangge.com/music.mp3") playerItem = AVPlayerItem(url: url!) player = AVPlayer(playerItem: playerItem!) //设置进度条相关属性 let duration : CMTime = playerItem!.asset.duration let seconds : Float64 = CMTimeGetSeconds(duration) playbackSlider!.minimumValue = 0 playbackSlider!.maximumValue = Float(seconds) playbackSlider!.isContinuous = false //播放过程中动态改变进度条值和时间标签 player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in if self.player!.currentItem?.status == .readyToPlay { //更新进度条进度值 let currentTime = CMTimeGetSeconds(self.player!.currentTime()) self.playbackSlider!.value = Float(currentTime) //一个小算法,来实现00:00这种格式的播放时间 let all:Int=Int(currentTime) let m:Int=all % 60 let f:Int=Int(all/60) var time:String="" if f<10{ time="0\(f):" }else { time="\(f)" } if m<10{ time+="0\(m)" }else { time+="\(m)" } //更新播放时间 self.playTime!.text=time } } } //播放按钮点击 @IBAction func playButtonTapped(_ sender: Any) { //根据rate属性判断当天是否在播放 if player?.rate == 0 { player!.play() playButton.setTitle("暂停", for: .normal) } else { player!.pause() playButton.setTitle("播放", for: .normal) } } //拖动进度条改变值时触发 @IBAction func playbackSliderValueChanged(_ sender: Any) { let seconds : Int64 = Int64(playbackSlider.value) let targetTime:CMTime = CMTimeMake(seconds, 1) //播放器定位到对应的位置 player!.seek(to: targetTime) //如果当前时暂停状态,则自动播放 if player!.rate == 0 { player?.play() playButton.setTitle("暂停", for: .normal) } } //页面显示时添加歌曲播放结束通知监听 override func viewWillAppear(_ animated: Bool) { NotificationCenter.default.addObserver(self, selector: #selector(finishedPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem) } //页面消失时取消歌曲播放结束通知监听 override func viewWillDisappear(_ animated: Bool) { NotificationCenter.default.removeObserver(self) } //歌曲播放完毕 @objc func finishedPlaying(myNotification:NSNotification) { print("播放完毕!") let stopedPlayerItem = myNotification.object as! AVPlayerItem stopedPlayerItem.seek(to: kCMTimeZero, completionHandler: nil) playButton.setTitle("播放", for: .normal) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }