StreamingKit是一個適用于iOS和Mac OSX的音頻播放流媒體庫。提供了一個簡潔的面向對象API,簡單易用,用于在CoreAudio框架下進行音頻的解壓和播放處理。StreamingKit是唯一支持不同格式音頻文件無縫播放的音頻播放流媒體庫。github地址:https://github.com/tumtumtum/StreamingKit
簡單的介紹一下使用:
定義STKAudioPlayer屬性audioPlayer 并在viewDidLoad中初始化,設置代理.
audioPlayer = STKAudioPlayer()
audioPlayer.delegate = self
播放暫停按鈕的點擊事件:
dynamic func playOrPause(sender:UIButton){
//1.開啟播放
//2.暫停播放
//3.繼續播放
//4.重新播放
if firstPlay == true { //1、4
let urll = NSURL(string: musicModel.videoUrl)
if let musicPlayUrl = urll{
audioPlayer.playURL(musicPlayUrl)
print("__________這是音頻播放的url_______\(musicPlayUrl)__________")
}
//設置定時器顯示進度
timer = NSTimer(timeInterval: 0.1, target: self, selector: #selector(track), userInfo: nil, repeats: true)
// timer.fire()
NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)
//后臺控制面板信息
newMusicInfo()
self.firstPlay = false
}else{
if self.audioPlayer.state.rawValue == 3{
//暫停
audioPlayer.pause()
}else{
//繼續
audioPlayer.resume()
}
}
}
定時器方法:(自定義部分可忽略不看,大致就是實時獲取音樂當前的播放時間與總時間并賦值給界面)
dynamic func track(){
// print("******總時間********\(self.audioPlayer.duration)++++++")
// print("******播放進度********\(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
}
}
底部進度條(自定義UISlider)拖動實現的方法:[邏輯是先暫停,再通過seekToTime方法到指定進度,然后繼續]
dynamic func sliderDown(slider:UISlider){
audioPlayer.pause()
}
dynamic func sliderTouchUpInside(slider:UISlider){
print("+++++拖動值+++++\(Double(slider.value))+++")
audioPlayer.seekToTime(Double(slider.value))
audioPlayer.resume()
}
最后羅列一下必須實現的代理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) {
}
}