MPMoviePlayerController,在后台播放音频和视频(分离视频层?)

时间:2013-03-20 06:21:12

标签: objective-c ios6 avfoundation mpmusicplayercontroller

我遇到一些问题,一旦屏幕锁定/应用程序背景化,MPMoviePlayerController同时播放音频和视频以继续播放。

这是我尝试过的:

“必需的背景模式”是带有第一个条目的数组:[Item 0:App Plays Audio]。

另外,我的视图控制器有:

-(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的示例应用程序,它允许您通过确定流URL并使用MPMoviePlayerController播放来播放YouTube视频。上面的完整代码是on github - 它是一个修改过的LBYouTubeView项目。

音频/视频播放正常,但当应用程序最小化时(无论我尝试什么),MPMoviePlayerController都会暂停。

我仔细阅读了文档&所以解决方案,但无济于事。

注意:Apple的Technote“[在后台播放媒体](在后台播放媒体)”声明:

  

播放视频的应用程序无法在后台播放该视频。

但接着说:

  

注意:如果您禁用电影中的视频曲目,或将AVPlayerLayer与其关联的AVPlayer分离,它将允许电影音频继续在后台播放。

那么 - 有没有人对如何实现这一点有任何想法?我知道我可以将提取的YouTube网址提供给Matt Gallagher's Audio Streamer之类的内容,并获得完整的仅音频支持播放/暂停/手机锁定等功能,但不幸的是我仍然需要视频。感谢

P.S。重复一下:我正在尝试使用的代码是on github我的更改 - 它只是一个修改过的LBYouTubeView项目,除了我上面详述的内容之外,几乎没有什么变化。

编辑 Matt Gallagher已经written a post on CocoaWithLove解决了这个问题 - 当应用程序最小化时,他似乎决定切换到仅音频流,但他承认这有点不可靠,因为它导致几秒钟的静音(当最小化和恢复应用程序时),同时缓冲新流。不理想:(

1 个答案:

答案 0 :(得分: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