iOS AVPlayer之後臺連續播放視訊

盧三發表於2017-12-25

很多開發者以為AVPlayer不能在後臺播放視訊:應用退到後臺,但能播放視訊的聲音(ps:不是通過切換相同的音訊來實現),我在開發SDK的過程中也遇到這個需求,所幸解決了這個問題。下面我就來講講實現的過程。

一 iOS和tvOS應用程式需要您啟用某些後臺操作的某些功能。 播放應用程式所需的常見功能是播放背景音訊。 啟用此功能後,當使用者切換到其他應用或鎖定iOS裝置時,您的應用的音訊可以繼續。 此功能也需要在iOS中啟用高階播放功能,如AirPlay流媒體和畫中畫播放功能。啟用背景音訊有兩種方法: 1.在info.plist檔案中新增Required background modes 如下圖所示

螢幕快照 2017-09-11 上午9.45.19.png
2.工程Capabilities
螢幕快照 2017-09-11 上午10.12.49.png

二 AVPlayer的處理 如果AVPlayer的當前專案在裝置的螢幕上顯示視訊 ,則當應用程式傳送到後臺時, AVPlayer播放將自動暫停。 有兩種方法可以防止這種暫停: 1.禁用播放器專案中的視訊軌道。這種方法僅適用本地檔案,不可用於網路視訊。

讓playerItem = <#你的播放器專案#> 
讓tracks = playerItem.tracks 
for trackItemTrack in tracks { 
//查詢視訊軌道並禁用軌道 
playerItemTrack.assetTrack.hasMediaCharacteristic(AVMediaCharacteristicVisual){ 
 playerItemTrack.isEnabled = false
} 
}
複製程式碼

2.從相關的AVPlayer刪除AVPlayer(將AVPlayerLayer player屬性設定為nil)。這種方法不僅適用於本地視訊,還適用於網路視訊,重點推薦。 重要提示:這些更改必須在應用程式實際切換到後臺之前生效。 否則AVPlayer將被暫停。 應用程式委託的applicationDidEnterBackground方法方便此目的。 如果禁用任何視訊軌道,則當應用程式轉換到前臺或視訊無法恢復播放時,必須重新啟用這些視訊軌道。 同樣,您必須將任何AVPlayerLayer重新連線到AVPlayer 。 應用程式委託applicationDidBecomeActive方法方便此目的。

//已經進入後臺

- (void)applicationDidEnterBackground:(UIApplication *)application {

   LYAVPlayerView *playerView =[LYAVPlayerView sharedInstance];
   [playerView.playerLayer setPlayer:nil];
}
複製程式碼

//已經啟用

- (void)applicationDidBecomeActive:(UIApplication *)application {

    LYAVPlayerView *playerView =[LYAVPlayerView sharedInstance];
    AVPlayer *player =playerView.player;
    [playerView.playerLayer setPlayer:player];
}
複製程式碼

播放完畢後接著在代理方法裡播放下一個視訊就可實現後臺連續播放視訊:

//播放完畢
- (void)videoPlayerDidReachEnd:(LYAVPlayerView *)playerView{
    
     NSLog(@"播放完畢");
    
    [self.playerView setURL:[NSURL URLWithString:VideoURL]];
    [self.playerView play];
    
}
複製程式碼

GitHub原始碼

相關文章