iOS AVAudioPlayer中斷事件結(jié)束繼續(xù)播放

問題:點(diǎn)擊微信語音播放結(jié)束后,后臺(tái)音樂播放器不能在當(dāng)前時(shí)間基礎(chǔ)上播放,而是重新開始播放。

思考:中斷事件處理方式,一般都是中斷開始的時(shí)候暫停播放器,中斷結(jié)束的時(shí)候播放,我就是按這種方式出現(xiàn)了上述bug,不知道其他人有遇到?jīng)]。測試的過程中發(fā)現(xiàn),當(dāng)我拖動(dòng)滑塊以后,再重復(fù)上述操作(點(diǎn)擊微信語音,結(jié)束以后),發(fā)現(xiàn)音樂播放器能繼續(xù)中斷之前的播放時(shí)間播放,如果不拖動(dòng)滑塊,而是自然播放的話,就會(huì)出現(xiàn)問題描述的bug. 查閱資料網(wǎng)上沒有相關(guān)的處理,回到問題的本身,不能在中斷的時(shí)間的基礎(chǔ)上繼續(xù)播放,說明AVAudioPlayer類沒有保存當(dāng)前的播放時(shí)間,或者說中斷事件回來以后它的屬性curretTime值丟失了(原因就不得而知了),ok,那我可以在中斷開始的時(shí)候保存當(dāng)前播放的時(shí)間,等中斷結(jié)束以后再把當(dāng)前時(shí)間賦值給AVAudioPlayer的curretTime屬性,另外這里需要稍微做下處理,就是排除中斷情況,這種代碼對(duì)其它正常播放事件的影響。

解決辦法:
在封裝播放音樂的類里面創(chuàng)建兩個(gè)變量

@property (nonatomic,assign) NSTimeInterval  currentPlayTime;

@property (nonatomic,assign) BOOL  isPause;

在播放音樂的方法里面加入

   if (![player isPlaying]) {
        //解決中事件恢復(fù)后不能記錄之前的播放時(shí)間
        if (self.isPause) {
           player.currentTime = self.currentPlayTime;
            self.isPause = NO;
        }
        [player play];
    }

在暫停播放音樂的方法里面加入

-(void)pauseMusic:(NSString *)fileName
{
    if (fileName == nil || fileName.length == 0) return;
    
    AVAudioPlayer * player = self.musicPlayers[fileName];
    if ([player isPlaying]) {
        self.currentPlayTime = player.currentTime;
        self.isPause = YES;
        [player pause];
    }
}

結(jié)果:上述思路可以解決該問題,如開發(fā)音樂播放器有出現(xiàn)上述問題的開發(fā)者可以下載具體代碼了解。github地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容