MPMoviePlayerController фоновая проблема аудио в iOS5 - PullRequest
6 голосов
/ 17 ноября 2011

У меня есть приложение, которое выполняет довольно стандартную операцию: Он воспроизводит аудио (потоковое или в файловой системе), когда приложение находится в 1) режиме переднего плана, 2) заблокированном экране 3) фоновом режиме. Это работало нормально во всех iOS до iOS5.

Я использую MPMoviePlayerController (потому что он может воспроизводить потоковое и локальное аудио файловой системы) У меня есть следующие настройки:

  1. Для info.plist задан фоновый режим "Аудио"
  2. У меня настроена аудиосессия, как показано на http://developer.apple.com/library/ios/#qa/qa1668/_index.html

    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. У меня есть использование MoveplayerApplicationAudioSession = NO
  5. Я подписался на следующие события для обнаружения и обработки различных состояний воспроизведения и для запуска нового аудиофайла в конце текущего файла. MPMoviePlayerLoadStateDidChangeNotification MPMoviePlayerPlaybackDidFinishNotification MPMoviePlayerPlaybackStateDidChangeNotification MPMoviePlayerNowPlayingMovieDidChangeNotification

Проблема:

При этом звук начинает воспроизводиться, и когда приложение переводится в фоновое состояние или если телефон заблокирован, звук продолжает воспроизводиться. Но после того, как я запускаю другой аудиофайл, Я сразу начинаю получать PlaybackDidFinishNotification с состоянием, установленным как «Воспроизведение завершено» (но файл никогда не воспроизводился)

Этот же код воспроизводит аудиофайлы в режиме переднего плана (после завершения текущего аудиофайла следующий файл запускается без проблем)

Есть ли что-то новое в iOS5, что я должен сделать, чтобы это заработало? Я прочитал ссылку на класс MPMoviePlayerController и не увидел ничего специфического для iOS5.

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 19 ноября 2011

Наконец-то разобрался с проблемой. Это решено в этом сообщении на форумах Apple Dev (для просмотра необходимо войти в систему). Этот пост был применим к AVPlayer, но также исправляет проблему с MPMoviePlayerController.

По сути, это выдержка из этого поста:

Ваше приложение должно поддерживать события дистанционного управления! Это аудио Интерфейс контроллера prex / nex / play / pause слева от многозадачности Панель задач переключателя (не уверен насчет правильного названия вещи). Вы чтобы убедиться, что ваш взгляд становится первым контроллером, а затем вызывается

> [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

в viewDidLoad. Как только вы это сделаете, ваш игрок больше не вернется НЕТ !!

0 голосов
/ 21 июня 2013

У меня была другая ситуация, и я только отвечаю здесь (и на другой вопрос 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 PlayState timeout в консоли.

Оказывается, что передача пустого запроса вызывает остановкуи сообщение.Исправлена ​​логика моего приложения, чтобы проигрывать песню только тогда, когда песня для воспроизведения исправила ее.

...