在網上看到有人說AVplay就可以播放流媒體,便拿過來使用,,結果發現無論如何它都是要把MP3緩衝完成之後才開始播放,,音頻長的就要等好久,對於M4A 格式的還有好些,MP3就不行了,,這樣體驗非常差。於是在網上搜羅方法,,找到了FreeStreamer 庫 可以實現邊緩衝邊播放MP3檔案,,網上資料比較少。。在這裡大致做下總結。。My Code寫的並不好 只是給需要的做個參考 支援mp3和m4a格式 後面還有一篇DOUAudioStreamer 的總結 可以參考下
1.使用cocoapods 添加FreeStreamer庫
pod 'FreeStreamer','~> 3.7.2' 2.
#import <FSAudioStream.h>
- (void)viewWillAppear:(BOOL)animated{
[superviewWillAppear:animated];
// 開始接受遠端控制 為添加到音頻中心後台播放做準備
[[UIApplicationsharedApplication]beginReceivingRemoteControlEvents];
[selfbecomeFirstResponder];
}
- (void)viewWillDisappear:(BOOL)animated{
[superviewWillDisappear:animated];
// 結束遠端控制 為添加到音頻中心後台播放做準備
[[UIApplicationsharedApplication]endReceivingRemoteControlEvents];
[selfresignFirstResponder];
}
// 重寫父類成為響應者方法 為添加到音頻中心後台播放做準備
- (BOOL)canBecomeFirstResponder {
returnYES;
}
#pragma mark 重寫父類方法,接受外來事件的處理 為添加到音頻中心後台播放做準備
- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
if (receivedEvent.type ==UIEventTypeRemoteControl) {
switch (receivedEvent.subtype) {//得到事件類型
caseUIEventSubtypeRemoteControlTogglePlayPause://暫停 ios6
self.play =YES;//調用你所在項目的暫停按鈕的回應程式法下面的也是如此
[selfplayAction];
break;
caseUIEventSubtypeRemoteControlPreviousTrack: //上一首
[selflastButtonAction];
break;
caseUIEventSubtypeRemoteControlNextTrack://下一首
[selfnextButtonAction];
break;
caseUIEventSubtypeRemoteControlPlay://播放
self.play =NO;//調用你所在項目的暫停按鈕的回應程式法下面的也是如此
[selfplayAction];
break;
caseUIEventSubtypeRemoteControlPause://暫停 ios7
self.play =YES;//調用你所在項目的暫停按鈕的回應程式法下面的也是如此
[selfplayAction];
break;
default:
break;
}
}
}
//Now Playing Center可以在鎖定畫面展示音樂的資訊,也達到增強使用者體驗的作用。
#pragma mark 傳遞資訊到鎖屏狀態下此方法在播放歌曲與切換歌曲時調用即可
- (void)configNowPlayingCenter:(YiPinXiangXiBody *)body {
NSMutableDictionary * info = [NSMutableDictionarydictionary];
//音樂的標題
[info setObject:body.titleforKey:MPMediaItemPropertyTitle];
//音樂的藝術家
[info setObject:body.columnNameforKey:MPMediaItemPropertyArtist];
//音樂的封面
UIImage *image = [[UIImagealloc]initWithData:[NSDatadataWithContentsOfURL:[NSURLURLWithString: [NSStringstringWithFormat:@"%@%@",URLADDRESS,body.cover]]]];
MPMediaItemArtwork * artwork = [[MPMediaItemArtworkalloc]initWithImage:image];
[info setObject:artworkforKey:MPMediaItemPropertyArtwork];
//完成設定
[[MPNowPlayingInfoCenterdefaultCenter]setNowPlayingInfo:info];
// NSLog(@"----%lld--------%f------",self.player.currentTime.value,self.totalTime);
}
#pragma mark 初始化播放器
- (void)playerInit:(NSURL *)url{
if (!_audioStream) {
// 建立FSAudioStream對象
_audioStream=[[FSAudioStreamalloc]init];
// 設定聲音
[_audioStreamsetVolume:1];
}
_audioStream.url = url;
[_audioStream play];
_audioStream.onFailure=^(FSAudioStreamError error,NSString *description){
NSLog(@"播放出現問題%@",description);
};
__weaktypeof(self) weakSelf =self;
_audioStream.onCompletion=^(){
[weakSelf nextButtonAction];// 播放完成後繼續播放下一個
};
// 計時器 擷取播放進度和緩衝進度
self.playerTimer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(playProgressAction)userInfo:nilrepeats:YES];
// 將視頻資訊添加到Playing Center 鎖屏顯示播放資訊 控制播放暫停
[selfconfigNowPlayingCenter:self.yiPinXiangXi.body];
}
#pragma mark 音頻緩衝和播放進度提示
- (void)playProgressAction{
FSStreamPosition cur =self.audioStream.currentTimePlayed;
self.playbackTime =cur.playbackTimeInSeconds/1;
double minutesElapsed =floor(fmod(self.playbackTime/60.0,60.0));
double secondsElapsed =floor(fmod(self.playbackTime,60.0));
self.nowTimeLabel.text = [NSStringstringWithFormat:@"%02.0f:%02.0f",minutesElapsed, secondsElapsed];
self.sliderProgress.value = cur.position;//