最近項目中用到網(wǎng)絡(luò)音頻播放务漩,寫了一個簡單的播放器,沒有什么特別之處它褪,滿足項目需求饵骨。遇到一些小問題,記錄一下茫打。
1居触,后臺持續(xù)播放。這個需求很正常老赤,比較簡單轮洋,在Capabilities中打開后臺模式,勾選audio抬旺。然后代碼注冊后臺事件弊予。如果是播放本地音頻,這樣既可开财,但是網(wǎng)絡(luò)音頻最好申請一個后臺ID汉柒,否則可能會在播放時突然中斷。
- (void)applicationWillResignActive:(MMUIApplication *)application {
/* 以下3行注冊后臺事件责鳍。一般寫在AppDelegate的- (BOOL)application:(MMUIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中碾褂。但是寫在這里,會和別的音樂播放app爭奪audio session資源历葛。例如網(wǎng)易云音樂正塌。打開app網(wǎng)易云音樂就會被打斷播放,我的項目并不是純音樂播放啃洋,有資訊和論壇,這樣如果沒有播放音頻就打斷別的app屎鳍,體驗不好宏娄,所以這三行代碼我寫在播放的viewController中。(網(wǎng)易云音樂只要打開就會打斷別的app的音頻播放逮壁,牛)孵坚。
另外我會在AppDelegate的- (void)applicationWillResignActive:(MMUIApplication *)application方法中也寫一次,不然我的項目中有時候退到后臺,音樂會莫名停止卖宠。
*/
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
/*
這兩行注冊接收鎖屏狀態(tài)下的播放控制中心遠(yuǎn)程事件巍杈,如耳機(jī)控制。不寫的話鎖屏后沒有播放信息扛伍。
*/
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
//后臺ID
_bgTaskId = [MMUIApplication backgroundPlayerID:_bgTaskId];
}
+(UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId {
//設(shè)置后臺任務(wù)ID
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
if(newTaskId != UIBackgroundTaskInvalid && backTaskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:backTaskId];
}
return newTaskId;
}
2筷畦,鎖屏狀態(tài)下的時間進(jìn)度問題。配置好播放控制中心后刺洒,系統(tǒng)會根據(jù)播放狀態(tài)自動控制時間的走動鳖宾,但是暫停再繼續(xù)播放后會發(fā)現(xiàn)時間會跳,暫停的時間也會被加上去逆航。只好每秒都設(shè)置 播放中心信息鼎文。這樣切換歌曲也不會出現(xiàn)問題。不然因俐,播放時間會異常拇惋。
_timeObserve = [_player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
float current = CMTimeGetSeconds(time);
float total = CMTimeGetSeconds(weakSelf.currentItem.duration);
//監(jiān)聽是否進(jìn)入后臺,后臺模式下每秒都配置媒體中心數(shù)據(jù)
if (weakSelf.background) {
[weakSelf configNowPlayingCenter];
}
if (!weakSelf.isLive && current > 0.0 && total > 0.0) {
weakSelf.progress = current / total;
weakSelf.playTime = current;
weakSelf.itemDuration = total;
}
//發(fā)通知告訴外部更新播放進(jìn)度
}];
3抹剩,播放緩沖時間撑帖。在我的項目中,直播只需要很少的緩沖就能很快播放吧兔,但是回放就需要8秒左右的緩沖時間磷仰,太久了。查到一個屬性境蔼,ios10之后可用灶平,能支持大多數(shù)用戶了。設(shè)置后緩沖時間明顯減少箍土,和直播緩沖時間差不多逢享,提高體驗。
if( [[UIDevice currentDevice] systemVersion].intValue >= 10){
_player.automaticallyWaitsToMinimizeStalling = NO;
}