2013-03-20 256 views
0

我有一些問題讓MPMoviePlayerController播放音頻和視頻繼續屏幕鎖/應用程序後臺。MPMoviePlayerController,與音頻和視頻背景播放(分離視頻層?)

這是我已經試過:

「所需的背景模式」是與第一項的數組:[項目0:應用程序播放音頻。

而且,我的視圖控制器具有:

-(void)viewDidLoad { 
    [super viewDidLoad]; 


    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 

    NSError *setCategoryError = nil; 
    BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; 
    if (!success) { 
     NSLog(@"DOH Could not set Category!"); 
    } 

    NSError *activationError = nil; 
    success = [audioSession setActive:YES error:&activationError]; 
    if (!success) { 
     NSLog(@"DOH Could not set Active!"); 
    } 

    … 

} 


- (void)viewWillAppear:(BOOL)animated { 

     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
     [self becomeFirstResponder]; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    switch (event.subtype) { 
     case UIEventSubtypeRemoteControlPlay: 
      NSLog(@"Play"); 
      break; 
     case UIEventSubtypeRemoteControlPause: 
      NSLog(@"Pause"); 
      break; 
     default: 
      break; 
    } 
} 

- (BOOL)canBecomeFirstResponder{ 
    return YES; 
} 

,我試圖修改該應用程序是(所有意圖和目的)的示例應用程序的LBYouTubeView,它允許您通過確定播放YouTube視頻流URL,並使用MPMoviePlayerController播放它。上面的完整代碼是on github - 它是一個修改的LBYouTubeView項目。

音頻/視頻播放正常,但是當應用程序最小化時(無論我嘗試什麼),MPMoviePlayerController都會暫停。

我已經鑽研了文檔& SO的解決方案,但無濟於事。

注:蘋果公司的技術說明「[在後臺播放媒體(在後臺播放媒體)」指出:

應用播放視頻的不能繼續播放該視頻,同時在後臺運行。

,但接着說:

注:如果您在電影中禁用視頻軌道,或將其從相關AVPlayer卸下AVPlayerLayer它將使電影中的音頻繼續在後臺播放。

所以 - 有沒有人有任何想法如何這可能?我知道我可以將提取的YouTube網址提供給像Matt Gallagher's Audio Streamer之類的東西,並且只能完成音頻支持播放/暫停/電話鎖定等,但不幸的是,我仍然需要該視頻。謝謝

p.s.只需重複一遍:我試圖使用的代碼是on github伴隨着我的更改 - 它只是一個修改過的LBYouTubeView項目,除了我上面詳細介紹的以外,幾乎沒有什麼變化。

編輯馬特·加拉格爾有written a post on CocoaWithLove這個問題 - 似乎他看中切換到該應用程序最小化時,雖然他承認這是一個有點靠不住,因爲它會導致沉默了幾秒鐘,僅音頻流,(當最小化和恢復應用程序),同時它緩衝新的流。不理想:(

回答

0

端起來解決它,如下所示(寫在RubyMotion但語義相同的OBJ-C):

這些添加到您的init方法:

NSNotificationCenter.defaultCenter.addObserver(self, selector:'will_enter_foreground', name:UIApplicationWillEnterForegroundNotification, object:nil) 
    NSNotificationCenter.defaultCenter.addObserver(self, selector:'did_enter_background', name:UIApplicationDidEnterBackgroundNotification, object:nil) 

,然後:

def will_enter_foreground 
    unless @player.nil? 
     @player.currentItem.tracks.each do |track| 
     track.enabled = true if track.assetTrack.mediaType.eql?AVMediaTypeVideo 
     end 
    end 
    end 

    def did_enter_background 
    unless @player.nil? 
     @player.currentItem.tracks.each do |track| 
     track.enabled = false if track.assetTrack.mediaType.eql?AVMediaTypeVideo 
     end 
    end 
    end 
+0

該死的在這裏看到一些東西(試圖在背景中使用rubymotion進行視頻音頻)......但是有一個MPMoviePlayerViewController的實例,我相信這個實例必須在這裏被控制,我沒有得到你的位置得到這個'currentItem',因此'跟蹤' – Ben 2014-03-22 23:53:07

+0

'凱,'App.run_after(0.2){@ player.play}'與泡沫包裝。必須推遲。 – Ben 2014-03-23 00:39:14