Определение аудио сеанса
Аудио сеанс является посредником между Вашим приложением и iOS для конфигурирования аудио поведения. На запуск Ваше приложение автоматически получает одноэлементный сеанс аудио. Вы конфигурируете его для выражения аудио намерений приложения. Например:
Вы смешаете звуки своего приложения с теми из других приложений (таких как Музыкальное приложение), или Вы намереваетесь заставить другое аудио замолчать?
Как должен Ваше приложение для ответа на прерывание звука, такое как предупреждение Часов?
Когда пользователь включает или отключает гарнитуру, как должно ответить Ваше приложение?
Аудио конфигурация сеанса влияет на все аудио действие, в то время как Ваше приложение работает, за исключением пользовательского интерфейса, звуковые эффекты проиграли System Sounds Services API. Можно запросить аудио сеанс для обнаружения характеристик оборудования устройства приложение идет, такие как количество каналов и частота дискретизации. Эти характеристики могут варьироваться устройством и могут измениться согласно пользовательским действиям в то время как Ваше выполнение приложения.
Можно явно активировать и деактивировать аудио сеанс. Для звука приложения для игры, или для записи для работы аудио сеанс должен быть активным. Система может также деактивировать Ваш аудио сеанс — который это делает, например, когда телефонный вызов поступает или звуки аварийного сигнала. Такую деактивацию вызывают прерыванием. Аудио сеанс APIs обеспечивает способы ответить на и восстановиться с прерываний.
Аудио поведение значения по умолчанию сеанса
Аудио сеанс идет с некоторым поведением по умолчанию. В частности:
Воспроизведение включено, и запись отключена.
Когда пользователь перемещает переключатель Silent (или Ring/Silent включают iPhone) к «тихой» позиции, Ваше аудио заставлено замолчать.
Когда пользователь нажимает кнопку Sleep/Wake для блокировки экрана, или когда период Автоблокировки истекает, аудио заставлено замолчать.
То, когда Ваше аудио запускается, другое аудио на устройстве — таком как Музыкальное аудио приложения, уже игравшее — заставлено замолчать.
Все вышеупомянутое поведение предоставлено аудио категорией сеанса по умолчанию, AVAudioSessionCategorySoloAmbient
. Работа с Категориями предоставляет информацию о том, как включить категорию в Ваше приложение.
Когда Вы начинаете играть или записывать аудио, Ваш аудио сеанс начинается автоматически; однако, доверие активации по умолчанию является опасным состоянием для Вашего приложения. Например, если iPhone звонит, и пользователь игнорирует вызов — отъезд Вашего выполнения приложения — Ваше аудио больше может не играть, в зависимости от которой технологии воспроизведения Вы используете. Следующий раздел описывает некоторые стратегии контакта с такими проблемами, и Ответ на Прерывания входит в глубину по теме.
Можно использовать в своих интересах поведение по умолчанию, поскольку Вы реализовываете свое приложение во время разработки. Однако единственные времена, можно безопасно проигнорировать аудио сеанс для поставляющего приложения, являются ими:
Ваше приложение использует System Sound Services или UIKit
playInputClick
метод для аудио и использования никакой другой аудио APIs.System Sound Services является технологией iOS для игры звуковых эффектов пользовательского интерфейса и для вызова вибрации. Это является неподходящим для других целей. (См. Ссылку System Sound Services и Аудио Звуки UI (SysSound) проект примера кода.)
UIKit
playInputClick
метод позволяет Вам играть щелчки стандартной клавиатуры в пользовательском вводе или представлении аксессуара клавиатуры. Его аудио поведение сеанса обрабатывается автоматически системой. Посмотрите Входные Щелчки Игры в текстовом Руководстве по программированию для iOS.Ваше приложение не использует аудио вообще.
Во всех других случаях не поставляйте свое приложение с аудио сеансом по умолчанию.
Почему аудио сеанс по умолчанию обычно не то, что Вы хотите
Если Вы не инициализируете, конфигурируете, и явно используете свой аудио сеанс, Ваше приложение не может реагировать на прерывания или аудио аппаратные изменения маршрута. Кроме того, Ваше приложение не имеет никакого контроля над решениями OS о микшировании звука между приложениями.
Вот некоторые сценарии, демонстрирующие аудио поведение значения по умолчанию сеанса и как можно изменить его:
Сценарий 1. Вы пишете приложение аудиокниги. Пользователь начинает слушать Венецианского купца. Как только лорд Бассанио входит, Автоблокировка испытывает таймаут, экранные блокировки, и Ваше аудио идет тихое.
Чтобы гарантировать, что аудио продолжается после экранной блокировки, сконфигурируйте свой аудио сеанс для использования категории, поддерживающей воспроизведение и устанавливающей аудио флаг в
UIBackgroundModes
.Сценарий 2. Вы пишете игру шутера от первого лица, использующую находящиеся в OpenAL звуковые эффекты. Вы также обеспечиваете фоновую звуковую дорожку, но включаете опцию для пользователя выключить его и играть песню от музыкальной библиотеки пользователя вместо этого. После запуска песни мотивации пользователь запускает торпеду фотона во вражеское судно и музыкальные остановки.
Чтобы гарантировать, что музыка не прервана, сконфигурируйте свой аудио сеанс, чтобы позволить смешиваться. Используйте
AVAudioSessionCategoryAmbient
категория, или изменяютAVAudioSessionCategoryPlayback
категория для поддержки смешивания.Сценарий 3. Вы пишете приложение радио потоковой передачи, использующее Audio Queue Services для воспроизведения. В то время как пользователь слушает, телефонный вызов поступает и останавливает Ваш звук, как ожидалось. Пользователь принимает решение проигнорировать вызов и отклоняет предупреждение. Пользователь касается Игры снова для возобновления музыкального потока, но ничто не происходит. Для возобновления воспроизведения пользователь должен выйти приложения и перезапустить его.
Для обработки прерывания аудио-очереди корректно установите надлежащую категорию и регистр для
AVAudioSessionInterruptionNotification
и имейте свое приложение, отвечают соответственно.
Как системные решения, конкурирующие аудио требования
Поскольку Ваше приложение для iOS запускается, встроенные приложения (сообщения, Музыка, Safari, телефон) могут работать в фоновом режиме. Каждый из них может произвести аудио: текстовое сообщение поступает, подкаст, который Вы запустили 10 минут назад, продолжает играть и т.д.
При размышлении об устройстве на iOS как об аэропорте, с приложениями, представленными как едущие на такси плоскости, система служит своего рода контрольно-диспетчерским пунктом. Ваше приложение может выполнить аудио запросы и утвердить его желаемый приоритет, но окончательное решение по тому, что происходит “на гудронированном шоссе”, прибывает из системы. Вы связываетесь с «контрольно-диспетчерским пунктом» с помощью аудио сеанса. В то время как Музыкальное приложение уже играет, рисунок 1-1 иллюстрирует типичный сценарий — Ваше приложение, желающее использовать аудио. В этом сценарии Ваше приложение прерывает Музыкальное приложение.
На шаге 1 числа, Вашей активации запросов приложения его аудио сеанса. Вы выполнили бы такой запрос, например, на запуске приложения, или возможно в ответ на пользователя, касающегося кнопки воспроизведения в приложении аудиозаписи и воспроизведения. На шаге 2 система рассматривает запрос активации. В частности это рассматривает категорию, которую Вы присвоили своему аудио сеансу. На рисунке 1-1 приложение SpeakHere использует категорию, требующую, чтобы другое аудио было заставлено замолчать.
На шагах 3 и 4 система деактивировала аудио сеанс приложения Музыки, останавливая его воспроизведение аудио. Наконец, на шаге 5, система активирует аудио сеанс приложения SpeakHere, и воспроизведение может начаться.
Система имеет окончательное решение активировать или деактивировать любое аудио настоящее сеанса на устройстве. Система соблюдает неприкосновенное правило, которое “всегда выигрывает телефон”. Никакое приложение, независимо от того как сильно это требует приоритет, не может превзойти телефон. Когда вызов поступает, пользователь уведомляется, и Ваше приложение прервано — независимо от того, какая операция передачи Вы переносите происходящий и независимо от того какую категорию Вы установили.
Слияние AVCaptureSession
Основа AV получает APIs (AVCaptureDevice
, AVCaptureSession
) позвольте Вам получить синхронизируемое аудио и видео от камеры и входов микрофона. С iOS 7, AVCaptureDevice
объект, представляющий вход микрофона, может совместно использовать Ваше приложение AVAudioSession
. По умолчанию, AVCaptureSession
сконфигурирует Ваш AVAudioSession
оптимально для записи, когда Ваш AVCaptureSession
использует микрофон. Установите automaticallyConfiguresApplicationAudioSession
свойство к НЕ для переопределения поведения по умолчанию и AVCaptureDevice
будет использовать Ваш ток AVAudioSession
настройки, не изменяя их. Посмотрите Ссылку класса AVCaptureSession и главу Получения Носителей для получения дополнительной информации.
Инициализация аудио сеанса
Система обеспечивает аудио объект сеанса на запуск Вашего приложения. Однако необходимо инициализировать сеанс для обработки прерываний.
Платформа Основы AV для управления прерываниями использует в своих интересах неявную инициализацию, происходящую, когда Вы получаете ссылку на AVAudioSession
объект, как показано здесь:
// implicitly initializes your audio session |
AVAudioSession *session = [AVAudioSession sharedInstance]; |
session
переменная теперь представляет инициализированный аудио сеанс и может сразу использоваться. Apple рекомендует неявную инициализацию при обработке прерываний звука с AVAudioSession
уведомления прерывания класса, или с протоколами делегата AVAudioPlayer
и AVAudioRecorder
классы.
Добавление регулятора громкости и управления маршрутами
Используйте MPVolumeView
класс для представления объема и направляющий управление для приложения. Представление объема обеспечивает ползунок для управления объемом из приложения и кнопки для выбора выходного маршрута аудио. Apple рекомендует использовать MPVolumeView
средство выбора маршрута AVAudioSessionPortOverride
при маршрутизации аудио встроенному динамику. Посмотрите Ссылку класса MPVolumeView.
Ответ на события дистанционного управления
События дистанционного управления позволяют пользователям управлять мультимедиа приложения. Если Ваше приложение играет звуковое содержимое или видеоконтент, Вы могли бы хотеть, чтобы он реагировал на события дистанционного управления, происходящие или из управления передачей или из внешних аксессуаров. iOS преобразовывает команды в UIEvent
объекты и поставляют события приложению. Приложение отправляет их первому респонденту и, если первый респондент не обрабатывает их, они перемещаются цепочка респондента.
Ваше приложение должно быть “Теперь Игрой” приложения и в настоящее время игры аудио, прежде чем это сможет реагировать на события. Посмотрите События Дистанционного управления и Ссылку класса MPNowPlayingInfoCenter.
Активация и деактивация аудио сеанса
Система активирует Ваш аудио сеанс на запуске приложения. Несмотря на это, Apple рекомендует явно активировать сеанс — обычно как часть приложения viewDidLoad
метод и набор предпочли аппаратные значения до активации Вашего аудио сеанса. Посмотрите Установку Предпочтительные Аппаратные Значения для примера кода. Это дает Вам возможность протестировать, успешно выполнилась ли активация. Однако, если Ваше приложение имеет игру/паузу элемент UI, запишите свой код так, чтобы пользователь нажал игру, прежде чем будет активирован сеанс. Аналогично, при изменении активного/неактивного состояния аудио сеанса, проверьте, чтобы гарантировать, что вызов успешен. Запишите свой код для корректной обработки отказа системы активировать сеанс.
Система деактивировала Ваш аудио сеанс для вызова по сигналу тревоги Часов или Календаря или входящего телефонного вызова. Когда пользователь отклоняет предупреждение или принимает решение проигнорировать телефонный вызов, система позволяет Вашему сеансу становиться активным снова. Повторно активировать ли сеанс в конце прерывания, зависит от типа приложения, как описано в Аудио Инструкциях Типом приложения.
Перечисление 1-1 показывает, как активировать Ваш аудио сеанс.
Перечисление 1-1 , Активирующееся аудио сеанс с помощью платформы Основы AV
NSError *activationError = nil; |
BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; |
if (!success) { /* handle the error in activationError */ } |
Деактивировать Ваш аудио сеанс, передачу NO
к setActive
параметр.
В конкретном случае игры или записи аудио с AVAudioPlayer
или AVAudioRecorder
объект, система заботится об аудио оживлении сеанса на конец прерывания. Тем не менее, Apple рекомендует, чтобы Вы зарегистрировались для уведомлений и явно повторно активировали свой аудио сеанс. Таким образом можно гарантировать, что оживление успешно выполнилось, и можно обновить состояние и пользовательский интерфейс приложения. Для больше на этом, посмотрите рисунок 3-1.
Большинство приложений никогда не должно деактивировать свой аудио сеанс явно. Важные исключения включают VoIP (Передача речи по протоколу IP) приложения, приложения навигации «поворот за поворотом», и, в некоторых случаях, записывая приложения.
Гарантируйте, что аудио сеанс для приложения VoIP, обычно работающего в фоновом режиме, активен только, в то время как приложение обрабатывает вызов. В фоновом режиме, будучи готов принимать вызов, аудио сеанс приложения VoIP не должен быть активным.
Гарантируйте, что аудио сеанс для приложения с помощью категории записи активен только при записи. Прежде чем запись запускается и при записи остановок гарантируйте, что сеанс неактивен для разрешения других звуков, таких как входящее сообщение предупреждает, для игры.
Проверка, играет ли другое аудио во время запуска приложения
Когда пользователь запускает Ваше приложение, звук может уже играть на устройстве. Например, Музыкальное приложение может играть музыку, или Safari может быть потоковым аудио, когда запускается Ваше приложение. Если Ваше приложение является игрой, эта ситуация является особенно выступом. Много игр имеют музыкальную звуковую дорожку, а также звуковые эффекты. В этом случае Звук в Инструкциях по Интерфейсу пользователя iOS советует Вам предполагать, что пользователи ожидают, что другое аудио будет продолжаться, поскольку они играют в Вашу игру, все еще играя звуковые эффекты игры.
Проверьте otherAudioPlaying
свойство, чтобы определить, играет ли аудио уже при запуске приложения. Если другое аудио играет, когда Ваше приложение запускается, отключите звук звуковой дорожки своей игры и присвойтесь AVAudioSessionCategorySoloAmbient
категория. Посмотрите Работу с Категориями для получения дополнительной информации о категориях.
Работа с аудио межприложения
В его наиболее канонической форме аудио межприложения позволяет одно приложение, названное приложением узла, для отправки его аудиовыхода в другое приложение, названное приложением узла. Однако для приложения узла также возможно отправить, его вывод к приложению узла, чтобы иметь приложение узла обрабатывают аудио и передают результат обратно приложению узла. Приложение узла должно иметь активный аудио сеанс; однако, для приложения узла только нужен активный аудио сеанс, если оно получает ввод от приложения узла или системы. Используйте следующие инструкции при установке аудио межприложения:
Установите право, «предают аудио приложения земле» и для узла и для приложения узла.
Установите флаг аудио UIBackgroundModes для приложения узла.
Установите флаг аудио UIBackgroundModes для приложений узла, использующих аудиовход или выводящих маршруты, в то время как одновременно соединено с узлом аудио межприложения.
Установите
AVAudioSessionCategoryOptionMixWithOthers
и для узла и для приложения узла.Удостоверьтесь, что аудио сеанс приложения узла активен, если он получает аудиовход от системы (или отправляет аудиовыход), в то время как одновременно соединено с межхостом приложений.