0

一旦屏幕锁定/应用程序进入后台,我在让 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 视频。上面的完整代码在 github 上——它是一个修改后的 LBYouTubeView 项目。

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

我已经仔细研究了文档和 SO 以寻求解决方案,但无济于事。

注意:Apple 的技术说明“[在后台播放媒体](在后台播放媒体)”指出:

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

但接着说:

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

那么 - 有没有人对这如何可能有任何想法?我知道我可以将提取的 YouTube URL 输入到诸如Matt Gallagher 的音频流媒体之类的东西中,并获得支持播放/暂停/电话锁定等的完整音频,但不幸的是我仍然需要视频。谢谢

ps 只是重复一遍:我正在尝试使用的代码在 github上进行了更改 - 它只是一个修改后的 LBYouTubeView 项目,除了我上面详述的内容外,几乎没有什么变化。

编辑Matt Gallagher在 CocoaWithLove 上写了一篇关于这个问题的帖子 - 似乎他决定在应用程序最小化时切换到纯音频流,尽管他承认这有点不可靠,因为它会导致几秒钟的沉默(当最小化和恢复应用程序)同时缓冲新流。不理想:(

4

1 回答 1

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
于 2013-11-22T10:23:12.690 回答