UIKit
AVFoundation
MediaPlayer
ViewController
UIViewController
//播放按钮
@IBOutlet
weak
playButton:
UIButton
!
//可拖动的进度条
playbackSlider:
UISlider
!
//当前播放时间标签
playTime:
UILabel
!
//播放器相关
playerItem:
AVPlayerItem
?
player:
AVPlayer
?
override
viewDidLoad() {
super
.viewDidLoad()
//初始化播放器
url =
URL
(string:
"http://mxd.766.com/sdo/music/data/3/m10.mp3"
)
playerItem =
AVPlayerItem
(url: url!)
player =
(playerItem: playerItem!)
//设置进度条相关属性
duration :
CMTime
= playerItem!.asset.duration
seconds :
Float64
=
CMTimeGetSeconds
(duration)
playbackSlider!.minimumValue = 0
playbackSlider!.maximumValue =
Float
(seconds)
playbackSlider!.isContinuous =
false
//播放过程中动态改变进度条值和时间标签
player!.addPeriodicTimeObserver(forInterval:
CMTimeMakeWithSeconds
(1,1),
queue:
DispatchQueue
.main) { (
) ->
Void
in
if
self
.player!.currentItem?.status == .readyToPlay &&
.player?.rate != 0{
//更新进度条进度值
currentTime =
(
.player!.currentTime())
.playbackSlider!.value =
Float
(currentTime)
//一个小算法,来实现00:00这种格式的播放时间
all:
Int
(currentTime)
m:
=all % 60
f:
=
Int
(all/60)
time:
String
=
""
if
f<10{
time=
"0(f):"
}
else
{
"(f)"
}
m<10{
time+=
"0(m)"
{
"(m)"
}
//更新播放时间
.playTime!.text=time
//设置后台播放显示信息
.setInfoCenterCredentials(playbackState: 1)
}
}
}
//播放按钮点击
@IBAction
playButtonTapped(_ sender:
) {
//根据rate属性判断当天是否在播放
player?.rate == 0 {
player!.play()
playButton.setTitle(
"暂停"
for
: .normal)
{
player!.pause()
"播放"
: .normal)
//后台播放显示信息进度停止
setInfoCenterCredentials(playbackState: 0)
}
}
//拖动进度条改变值时触发
playbackSliderValueChanged(_ sender:
) {
Int64
Int64
(playbackSlider.value)
targetTime:
CMTimeMake
(seconds,1)
//播放器定位到对应的位置
player!.seek(to: targetTime)
//如果当前时暂停状态,则自动播放
player!.rate == 0
{
player?.play()
: .normal)
}
}
//页面显示时添加相关通知监听
viewWillAppear(_ animated:
Bool
) {
//播放完毕
NotificationCenter
.
default
.addObserver(
name:
NSNotification
.
Name
.
AVPlayerItemDidPlayToEndTime
//告诉系统接受远程响应事件,并注册成为第一响应者
.shared.beginReceivingRemoteControlEvents()
.becomeFirstResponder()
}
//页面消失时取消歌曲播放结束通知监听
viewWillDisappear(_ animated:
) {
.removeObserver(
)
//停止接受远程响应事件
.shared.endReceivingRemoteControlEvents()
.resignFirstResponder()
}
//歌曲播放完毕
finishedPlaying(myNotification:
NSNotification
) {
(
"播放完毕!"
)
stopedPlayerItem:
= myNotification.object
as
!
AVPlayerItem
stopedPlayerItem.seek(to: kCMTimeZero)
}
//是否能成为第一响应对象
canBecomeFirstResponder:
{
true
}
// 设置后台播放显示信息
setInfoCenterCredentials(playbackState:
) {
mpic =
MPNowPlayingInfoCenter
()
//专辑封面
mySize =
CGSize
(width: 400,height: 400)
albumArt =
MPMediaItemArtwork
(boundsSize:mySize) { sz
in
return
UIImage
(named:
"cover"
)!
}
//获取进度
postion =
Double
.playbackSlider!.value)
duration =
Double
.playbackSlider!.maximumValue)
mpic.nowPlayingInfo = [
MPMediaItemPropertyTitle
:
"我是歌曲标题"
MPMediaItemPropertyArtist
"hangge.com"
MPMediaItemPropertyArtwork
: albumArt,
MPNowPlayingInfoPropertyElapsedPlaybackTime
: postion,
MPMediaItemPropertyPlaybackDuration
: duration,
MPNowPlayingInfoPropertyPlaybackRate
: playbackState]
}
//后台操作
remoteControlReceived(with event:
UIEvent
?) {
guard
event = event
{
"no eventn"
)
return
}
event.type ==
UIEventType
.remoteControl {
switch
event.subtype {
case
.remoteControlTogglePlayPause:
"暂停/播放"
)
.remoteControlPreviousTrack:
"上一首"
)
.remoteControlNextTrack:
"下一首"
)
.remoteControlPlay:
)
player!.play()
.remoteControlPause:
)
player!.pause()
//后台播放显示信息进度停止
setInfoCenterCredentials(playbackState: 0)
:
break
}
}
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}
|