StreamingKit是一個(gè)適用于iOS和Mac OSX的音頻播放流媒體庫螃壤。提供了一個(gè)簡潔的面向?qū)ο驛PI砰碴,簡單易用,用于在CoreAudio框架下進(jìn)行音頻的解壓和播放處理燕差。StreamingKit是唯一支持不同格式音頻文件無縫播放的音頻播放流媒體庫惭墓。github地址:https://github.com/tumtumtum/StreamingKit
簡單的介紹一下使用:
定義STKAudioPlayer屬性audioPlayer 并在viewDidLoad中初始化,設(shè)置代理.
audioPlayer = STKAudioPlayer()
audioPlayer.delegate = self
播放暫停按鈕的點(diǎn)擊事件:
dynamic func playOrPause(sender:UIButton){
//1.開啟播放
//2.暫停播放
//3.繼續(xù)播放
//4.重新播放
if firstPlay == true { //1挺尿、4
let urll = NSURL(string: musicModel.videoUrl)
if let musicPlayUrl = urll{
audioPlayer.playURL(musicPlayUrl)
print("__________這是音頻播放的url_______\(musicPlayUrl)__________")
}
//設(shè)置定時(shí)器顯示進(jìn)度
timer = NSTimer(timeInterval: 0.1, target: self, selector: #selector(track), userInfo: nil, repeats: true)
// timer.fire()
NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
//后臺(tái)控制面板信息
newMusicInfo()
self.firstPlay = false
}else{
if self.audioPlayer.state.rawValue == 3{
//暫停
audioPlayer.pause()
}else{
//繼續(xù)
audioPlayer.resume()
}
}
}
定時(shí)器方法:(自定義部分可忽略不看,大致就是實(shí)時(shí)獲取音樂當(dāng)前的播放時(shí)間與總時(shí)間并賦值給界面)
dynamic func track(){
// print("******總時(shí)間********\(self.audioPlayer.duration)++++++")
// print("******播放進(jìn)度********\(self.audioPlayer.progress)++++++")
let formatter = NSDateFormatter()
formatter.dateFormat = "mm:ss"
let elapsedTimeDate = NSDate(timeIntervalSince1970: audioPlayer.progress)
self.musicPlayerView.currentLabel.text = formatter.stringFromDate(elapsedTimeDate)
let timeRemainingDate = NSDate(timeIntervalSince1970: audioPlayer.duration)
self.musicPlayerView.totalLabel.text = formatter.stringFromDate(timeRemainingDate)
self.musicPlayerView.progressSlider.value = Float(audioPlayer.progress)
self.musicPlayerView.progressSlider.maximumValue = Float(audioPlayer.duration)
if audioPlayer.progress == audioPlayer.duration-0.01{
audioPlayer.stop()
self.musicPlayerView.currentLabel.text = "00:00"
self.musicPlayerView.totalLabel.text = "00:00"
self.musicPlayerView.progressSlider.value = 0
self.firstPlay = true
}
}
底部進(jìn)度條(自定義UISlider)拖動(dòng)實(shí)現(xiàn)的方法:[邏輯是先暫停,再通過seekToTime方法到指定進(jìn)度,然后繼續(xù)]
dynamic func sliderDown(slider:UISlider){
audioPlayer.pause()
}
dynamic func sliderTouchUpInside(slider:UISlider){
print("+++++拖動(dòng)值+++++\(Double(slider.value))+++")
audioPlayer.seekToTime(Double(slider.value))
audioPlayer.resume()
}
最后羅列一下必須實(shí)現(xiàn)的代理STKAudioPlayerDelegate
extension MusicDetailViewController: STKAudioPlayerDelegate {
dynamic func audioPlayer(audioPlayer: STKAudioPlayer, didStartPlayingQueueItemId queueItemId: NSObject) {
}
//typedef NS_OPTIONS(NSInteger, STKAudioPlayerState)
//{
// STKAudioPlayerStateReady,
//STKAudioPlayerStateRunning = 1,
//STKAudioPlayerStatePlaying = (1 << 1) | STKAudioPlayerStateRunning,
//STKAudioPlayerStateBuffering = (1 << 2) | STKAudioPlayerStateRunning,
//STKAudioPlayerStatePaused = (1 << 3) | STKAudioPlayerStateRunning,
//STKAudioPlayerStateStopped = (1 << 4),
//STKAudioPlayerStateError = (1 << 5),
//STKAudioPlayerStateDisposed = (1 << 6)
//};
dynamic func audioPlayer(audioPlayer: STKAudioPlayer, stateChanged state: STKAudioPlayerState, previousState: STKAudioPlayerState) {
switch state.rawValue {
case 3 : musicPlayerView.startPlayerBtn.selected = true
case 5: musicPlayerView.startPlayerBtn.selected = false
case 6: musicPlayerView.startPlayerBtn.selected = false
case 7: musicPlayerView.startPlayerBtn.selected = false
default: musicPlayerView.startPlayerBtn.selected = false
}
}
dynamic func audioPlayer(audioPlayer: STKAudioPlayer, didFinishBufferingSourceWithQueueItemId queueItemId: NSObject) {
}
dynamic func audioPlayer(audioPlayer: STKAudioPlayer, unexpectedError errorCode: STKAudioPlayerErrorCode) {
}
dynamic func audioPlayer(audioPlayer: STKAudioPlayer, didFinishPlayingQueueItemId queueItemId: NSObject, withReason stopReason: STKAudioPlayerStopReason, andProgress progress: Double, andDuration duration: Double) {
}
}