2013-03-20 216 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