iOS5中的MPMoviePlayerController背景音频问题

时间:2011-11-17 01:53:32

标签: ios5 mpmovieplayercontroller

我有一个应用程序执行非常标准的操作: 它在应用程序处于1)前景模式时播放音频(流式传输或在文件系统中),2)屏幕锁定状态3)背景模式。 这在iOS5之前的所有iOS中都运行良好。

我一直在使用MPMoviePlayerController(因为它可以播放流媒体和本地文件系统音频) 我有以下设置:

  1. info.plist将背景模式设置为“音频”
  2. 我有http://developer.apple.com/library/ios/#qa/qa1668/_index.html

    所示的Audiosession设置
    NSError *activationError = nil;
    AVAudioSession *mySession = [AVAudioSession sharedInstance];
    [mySession setCategory: AVAudioSessionCategoryPlayback error: &activationError];
    if (activationError) { /* handle the error condition */ }
    [mySession setActive: YES error: &activationError];
    if (activationError) { /* handle the error condition */ }
    
  3. 我启用了后台计时器,在音频播放结束时停止     UIBackgroundTaskIdentifier newId = [[UIApplication sharedApplication]                                     beginBackgroundTaskWithExpirationHandler:NULL];

  4. 我有Moveplayer的useApplicationAudioSession = NO
  5. 我订阅了以下事件来检测和处理各种播放状态,并在当前文件的末尾开始新的音频文件。     MPMoviePlayerLoadStateDidChangeNotification     MPMoviePlayerPlaybackDidFinishNotification     MPMoviePlayerPlaybackStateDidChangeNotification     MPMoviePlayerNowPlayingMovieDidChangeNotification
  6. 问题:

    这样,音频开始播放,当应用程序进入后台状态或手机被锁定时,音频继续播放。但是,当我开始另一个音频文件后, 我立即开始播放PlaybackDidFinishNotification,状态设置为播放结束(但文件从未播放过)

    相同的代码在前台模式下播放音频文件(当前音频文件结束后,下一个文件启动没有任何问题)

    iOS5中有什么新功能我应该这样做才能让它工作吗?我通读了MPMoviePlayerController类引用,但我看不到iOS5的任何特定内容。

    提前致谢。

2 个答案:

答案 0 :(得分:6)

终于弄明白了这个问题。这是在apple dev论坛的this帖子中解决的(需要登录才能看到)。该帖子适用于AVPlayer,但也解决了MPMoviePlayerController的问题。

基本上,这是该帖子的摘录:

  

您的应用必须支持远程控制事件!这些是音频   多任务左侧的控制器接口prex / nex / play / pause   切换器任务栏(不确定事物的正确名称)。您   确保您的视图成为第一个控制器,然后调用

> [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  在viewDidLoad中

。一旦你这样做,你的播放器将不再返回   NO !!

答案 1 :(得分:0)

我的情况有所不同,我只是在这里回答(以及在另一个SO问题中),以帮助未来的搜索者了解此错误消息。这不符合原始问题。

我的应用播放声音或一首歌,但是当我第一次编码时,它可以同时播放。在测试中,我总是用一首歌进行测试。我以通常的方式演奏了这首歌:

    self.musicQuery = [MPMediaQuery songsQuery];
    [_musicQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:selectedSongID forProperty:MPMediaItemPropertyPersistentID comparisonType:MPMediaPredicateComparisonEqualTo]];
    [_musicQuery setGroupingType:MPMediaGroupingTitle];
    [_myPlayer setQueueWithQuery:_musicQuery];

    [_myPlayer play];

周过去了,我开始测试声音,用AVAudioPlayer播放。我的应用程序开始冻结5秒钟,我在控制台中收到 MediaPlayer:Message playbackState超时消息。

事实证明,传递一个空的查询会导致冻结和消息。将我的应用程序的逻辑更改为仅在播放要播放的歌曲时播放歌曲。