Технические вопросы и ответы QA1668

Игра носителей, в фоновом режиме используя Основу AV на iOS

Q: Как я гарантирую, что мои носители будут продолжать играть при использовании Основы AV, в то время как мое приложение в фоновом режиме?

A: Необходимо объявить, что приложение играет слышимое содержание, в то время как в фоновом режиме, и присваивают надлежащую категорию аудио сеансу. См. также Специальные замечания для Видео Носителей.

Объявите, что Ваше приложение играет Слышимое Содержание в то время как в фоновом режиме

Во-первых, объявите, что Ваше приложение предоставляет определенные фоновые услуги и должно быть позволено продолжать работать в то время как в фоновом режиме. Чтобы сделать это, добавьте UIBackgroundModes введите файл своего приложения Info.plist. Его значение является массивом, содержащим одну или более строк, идентифицирующих который фоновые задачи Ваша поддержка приложений. Укажите строковое значение audio указать приложение играет слышимое содержание пользователю в то время как в фоновом режиме:

Рисунок 1  , Объявляющий приложение, играет слышимое содержание в фоновом режиме.

Перед iOS 5.0 необходимо было решить в AirPlay позволить носителям быть, чтобы быть переданными потоком к дисплеям высокой четкости и высокочастотным аудиосистемам. Подробные данные для выбора в и выбора из AirPlay варьируются в зависимости от метода воспроизведения носителей. Для получения дополнительной информации см. Обзор AirPlay.

Установка аудио категории сеанса

Необходимо присвоить надлежащую категорию аудио сеансу для обеспечения аудио игр даже заблокированным экраном и набором переключателя Ring/Silent к тихому. Вы не можете полагаться на аудио сеанс по умолчанию, категория которого AVAudioSessionCategorySoloAmbient (или эквивалентно, kAudioSessionCategory_SoloAmbientSound).

Для воспроизведения для продолжения, когда экран блокирует, или когда переключатель Ring/Silent установлен в тихий используйте AVAudioSessionCategoryPlayback (или эквивалент kAudioSessionCategory_MediaPlayback) категория. Перечисление 1 демонстрирует, как инициализировать аудио сеанс Вашего приложения с AVAudioSessionCategoryPlayback категория.

Перечисление 1  , Устанавливающее аудио категорию для разрешения воспроизведение, когда экран блокирует или когда переключатель Ring/Silent установлен в тихий.

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>
 
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
 
NSError *setCategoryError = nil;
BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
if (!success) { /* handle the error condition */ }
 
NSError *activationError = nil;
success = [audioSession setActive:YES error:&activationError];
if (!success) { /* handle the error condition */ }

См. Аудио Руководство по программированию Сеанса - Аудио Категории Сеанса для получения дополнительной информации о доступных аудио категориях сеанса.

Специальные замечания для видео носителей

Если AVPlayerтекущий элемент выводит на экран видео на дисплее устройства, воспроизведении AVPlayer когда приложение отправляется в фон, автоматически приостанавливается. Существует два способа предотвратить эту паузу:

Перечисление 2  , Запрещающее видеотреки в элементе проигрывателя.

#import <AVFoundation/AVFoundation.h>
 
AVPlayerItem *playerItem = <#Get your player item#>;
 
NSArray *tracks = [playerItem tracks];
for (AVPlayerItemTrack *playerItemTrack in tracks)
{
    // find video tracks
    if ([playerItemTrack.assetTrack hasMediaCharacteristic:AVMediaCharacteristicVisual])
    {
        playerItemTrack.enabled = NO; // disable the track
    }
}

Перечисление 3  Удаляет/Восстанавливает AVPlayerLayer и его связанное AVPlayer.

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
 
@interface MyPlayerLayerView : UIView
@end
 
@implementation MyPlayerLayerView
 
- (AVPlayerLayer *)playerLayer {
  return (AVPlayerLayer *)[self layer];
}
 
+ (Class)layerClass {
  return [AVPlayerLayer class];
}
 
@end
 
@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
...
@end
 
@implementation MyAppDelegate
 
...
 
/* Remove the AVPlayerLayer from its associated AVPlayer
    once the app is in the background. */
- (void)applicationDidEnterBackground:(UIApplication *)application {
  MyPlayerLayerView *playerView = <#Get your player view#>;
  [[playerView playerLayer] setPlayer:nil]; // remove the player
}
 
/* Restore the AVPlayer when the app is active again. */
- (void)applicationDidBecomeActive:(UIApplication *)application {
  MyPlayerLayerView *playerView = <#Get your player view#>;
  [[playerView playerLayer] setPlayer:_player]; // restore the player
}
 
...
 
@end


История версии документа


ДатаПримечания
12.02.2014

Добавленный фрагмент кода, показывающий, как удалить AVPlayer из AVPlayerLayer. Указанное использование приложения делегирует applicationDidEnterBackground как рекомендуемый метод для добавления кода для предотвращения видео паузы. Реорганизация части материала Вопросов и ответов. Другие разные изменения.

29.04.2013

Обновленные специальные замечания для воспроизведения Прямых трансляций HTTP.

11.04.2013

Если фрагменты кода, чтобы показать, как отключить проигрыватель видеотреки элемента. Добавленные специальные замечания для воспроизведения Прямых трансляций HTTP. Другие разные изменения.

06.03.2012

Обновленный для включения информации о AirPlay.

27.07.2010

Новый документ, обсуждающий носители игры, в фоновом режиме используя Основу AV на iOS