Используя аудио
iOS предлагает богатый набор инструментов для работы со звуком в Вашем приложении. Эти инструменты располагаются в платформы согласно функциям, которые они обеспечивают, следующим образом:
Используйте платформу Медиапроигрывателя для игры песен, аудиокниг или аудиоподкастов от библиотеки iPod пользователя. Для получения дополнительной информации посмотрите Ссылку Платформы Медиапроигрывателя, Руководство по программированию Библиотечного доступа iPod и проект примера кода AddMusic.
Используйте платформу Основы AV, чтобы играть и записать аудио с помощью простого интерфейса Objective-C. Для получения дополнительной информации см. Ссылку Платформы Основы AV и avTouch проект примера кода.
Используйте Аудио платформу Панели инструментов, чтобы играть аудио с возможностями синхронизации, пакетами доступа входящего аудио, проанализировать аудиопотоки, преобразовать форматы аудио и записать аудио с доступом к отдельным пакетам. Для получения дополнительной информации посмотрите Аудио Ссылку Платформы Панели инструментов и проект примера кода SpeakHere.
Используйте платформу Аудиоустройства, чтобы соединиться с и использовать плагины обработки аудиоданных. Для получения дополнительной информации посмотрите, что Аудиоустройство Размещает Руководство для iOS.
Используйте платформу OpenAL для обеспечения позиционного воспроизведения аудио в играх и других приложениях. iOS поддерживает OpenAL 1.1. Для получения информации о OpenAL посмотрите веб-сайт OpenAL, OpenAL FAQ для iPhone OS и oalTouch проект примера кода.
Чтобы позволить Вашему коду использовать функции аудио платформы, добавьте, что платформа к Вашему проекту XCode, ссылке против него в любых соответствующих целях, и добавляет надлежащее #import
оператор около вершины файлов соответствующего источника. Например, для обеспечения доступа к платформе Основы AV в исходном файле добавьте a #import <AVFoundation/AVFoundation.h>
оператор около вершины файла. Для получения дальнейшей информации о том, как добавить платформы к Вашему проекту, посмотрите Файлы в Проектах в Руководстве по управлению проектами XCode.
Этот раздел по звуку обеспечивает краткое введение в реализацию функций аудио iOS, как перечислено здесь:
Для игры песен аудиоподкасты и аудиокниги от библиотеки iPod пользователя, видят Играющие Аудио Элементы с Библиотечным доступом iPod.
Чтобы играть и записать аудио в наименьшем количестве строк кода, используйте платформу Основы AV. Посмотрите Звуки Игры Легко с Классом AVAudioPlayer и Записью с Классом AVAudioRecorder.
Для обеспечения полнофункционального воспроизведения аудио включая расположение стерео регулятор уровня и одновременные звуки, используют OpenAL. Посмотрите Звуки Игры с Расположением Используя OpenAL.
Для обеспечения самого низкого аудио задержки, особенно при выполнении одновременного ввода и вывода (такой что касается приложения VoIP), используют модуль I/O или Речь, Обрабатывающую модуль I/O. Посмотрите Поддержку Аудиоустройства в iOS.
Играть звуки с самым высоким уровнем контроля, включая поддержку синхронизации, Audio Queue Services использования. Посмотрите Звуки Игры с Control Using Audio Queue Services. Audio Queue Services также поддерживает запись и обеспечивает доступ к входящим аудио пакетам, как описано в Записи с Audio Queue Services.
Для парсинга аудио, переданного потоком от сетевого соединения, используйте Audio File Stream Services. Посмотрите Парсинг Переданное потоком Аудио.
Играть звуковые эффекты пользовательского интерфейса или вызвать вибрацию на устройства, обеспечивающие ту функцию, System Sound Services использования. Посмотрите Игру Звуковые эффекты UI или Invoking Vibration Using System Sound Services.
Обязательно считайте следующий раздел, Основы: Аудиокодеки, Поддерживаемые Форматы аудио и Одио Сешнз, для критической информации о том, как аудио работает в iOS. Также считайте Методы наиболее успешной практики для iOS Одио, предлагающий инструкции и перечисляющий форматы аудио и форматы файлов для использования для лучшей производительности и лучшего пользовательского опыта.
Когда Вы готовы вырыть глубже, iOS, Центр Dev содержит руководства, справочники, пример кода и т.д. Для всесторонних объяснений аудио разработки в iOS, видит Обзор Core Audio, Аудио Руководство по программированию Сеанса, Руководство по программированию Audio Queue Services, Руководство по Хостингу Аудиоустройства для iOS и Руководство по программированию Библиотечного доступа iPod.
Основы: аудиокодеки, поддерживаемые форматы аудио и аудио сеансы
Чтобы быть ориентированным к разработке аудио iOS, важно понять несколько критических вещей об аппаратной и программной архитектуре устройств на iOS — описанный в этом разделе.
Аппаратные и программные Аудиокодеки iOS
Для обеспечения оптимальной производительности и качества необходимо выбрать правильный формат аудио и тип аудиокодека. При запуске в iOS 3.0 большинство форматов аудио может использовать основанное на программном обеспечении кодирование (для записи) и декодирование (для воспроизведения). Кодеки программного обеспечения поддерживают одновременное воспроизведение многократных звуков, но могут повлечь за собой значительный CPU наверху.
Помогшее с аппаратными средствами декодирование обеспечивает превосходную производительность — но не поддерживает одновременное воспроизведение многократных звуков. Если необходимо максимизировать частоту видеокадров в приложении, минимизировать влияние на ЦП воспроизведения аудио при помощи несжатого аудио или формата IMA4, или использовать помогшее с аппаратными средствами декодирование сжатых аудио активов.
Для уведомления наиболее успешной практики относительно выбора формата аудио посмотрите Предпочтительные Форматы аудио в iOS.
Таблица 1-1 описывает аудиокодеки воспроизведения, доступные на устройствах на iOS.
Аудио формат декодера/воспроизведения | Помогшее с аппаратными средствами декодирование | Основанное на программном обеспечении декодирование |
---|---|---|
AAC (усовершенствованное кодирование звука MPEG 4) | Да | Да, запуск в iOS 3.0 |
ALAC (Apple Lossless) | Да | Да, запуск в iOS 3.0 |
HE-AAC (высокая эффективность MPEG 4 AAC) | Да | - |
iLBC (интернет-Низкоскоростной кодек, другой формат для речи) | - | Да |
IMA4 (IMA/ADPCM) | - | Да |
Линейный PCM (несжатая, линейная импульсно-кодовая модуляция) | - | Да |
MP3 (Уровень 3 аудио MPEG 1) | Да | Да, запуск в iOS 3.0 |
µ-law и закон | - | Да |
При использовании помогшего с аппаратными средствами декодирования устройство может играть только единственный экземпляр одного из поддерживаемых форматов за один раз. Например, при игре звука MP3 стерео использование аппаратного кодека второй одновременный звук MP3 будет использовать декодирование программного обеспечения. Точно так же Вы не можете одновременно играть AAC, и ALAC звучат как аппаратные средства использования. Если приложение iPod играет AAC или звук MP3 в фоновом режиме, это требовало аппаратного кодека; Ваше приложение тогда играет AAC, ALAC и аудио MP3 использование декодирования программного обеспечения.
Чтобы играть многократные звуки с лучшей производительностью или эффективно играть звуки, в то время как iPod играет в фоновом режиме, линейный (несжатый) PCM использования или IMA4 (сжал) аудио.
Чтобы изучить, как проверить во время выполнения, какие аппаратные и программные кодеки доступны на устройстве, считайте обсуждение для kAudioFormatProperty_HardwareCodecCapabilities
постоянный в Ссылке Audio Format Services и читают Технические Вопросы и ответы QA1663, “Определение доступности аппаратного кодера AAC во время выполнения”.
Подводить итог, как iOS поддерживает форматы аудио для единственного или многократного воспроизведения:
Линейный PCM и IMA4 (IMA/ADPCM) Вы могут играть многократный линейный PCM или звуки IMA4 одновременно в iOS, не подвергаясь проблемам ресурса CPU. То же является истиной для iLBC формата речевого качества, и для µ-law и законные сжатые форматы. При использовании сжатых форматов проверьте качество звука, чтобы гарантировать, что оно удовлетворяет Ваши потребности.
AAC, HE-AAC, MP3 и ALAC (Apple Lossless) Воспроизведение для AAC, HE-AAC, MP3 и звуков ALAC могут использовать эффективное помогшее с аппаратными средствами декодирование на устройствах на iOS, но эти кодеки вся доля единственный аппаратный путь. Устройство может играть только единственный экземпляр одного из этих форматов во время с помощью помогшего с аппаратными средствами декодирования.
Единственный аппаратный путь для AAC, HE-AAC, MP3 и воспроизведения ALAC имеет импликации для, «манипулируют» приложениями стиля, такими как виртуальное фортепьяно. Если пользователь будет играть песню в одном из этих трех форматов в приложении iPod, то Ваше приложение — для манипулирования по тому аудио — будет использовать декодирование программного обеспечения.
Таблица 1-2 описывает аудиокодеки записи, доступные на устройствах на iOS.
Аудио кодер/формат записи | Помогшее с аппаратными средствами кодирование | Основанное на программном обеспечении кодирование |
---|---|---|
AAC (усовершенствованное кодирование звука MPEG 4) | Да, запускаясь в iOS 3.1 для iPhone 3GS и iPod touch (второе поколение) Да, запускаясь в iOS 3.2 для iPad | Да, запускаясь в iOS 4.0 для iPhone 3GS и iPod touch (второе поколение) |
ALAC (Apple Lossless) | - | Да |
iLBC (интернет-Низкоскоростной кодек, для речи) | - | Да |
IMA4 (IMA/ADPCM) | - | Да |
Линейный PCM (несжатая, линейная импульсно-кодовая модуляция) | - | Да |
µ-law и закон | - | Да |
Аудио сеансы
Сеанс аудио iOS APIs позволяет Вам определить общее аудио поведение своего приложения и разработать его для работы хорошо в большем аудио контексте устройства, на котором это работает. Этот APIs описан в Аудио Ссылке класса Ссылки и AVAudioSession Сеансовых служб. Используя этот APIs, можно указать такие способы поведения как:
Должно ли Ваше аудио быть заставлено замолчать переключателем Silent (на iPhone, это вызывают переключателем Ring/Silent),
Должно ли Ваше аудио остановиться на экранную блокировку
Когда Ваше аудио запускается, должно ли другое аудио, такой как от iPod, продолжать играть или быть заставлено замолчать
Аудио APIs сеанса также позволяет Вам реагировать на пользовательские действия, такие как включение в или отключение гарнитур, и к событиям, использующим звуковое оборудование устройства, такое как Часы и Календарные предупреждения и входящие телефонные вызовы.
Аудио сеанс APIs обеспечивает три программируемых функции, описанные в Таблице 1-3.
Аудио функция сеанса | Описание |
---|---|
Установка категорий | Категория является ключом, идентифицирующим ряд аудио способов поведения для Вашего приложения. Путем установки категории Вы указываете свои аудио намерения к iOS, такой как, должно ли Ваше аудио продолжаться, когда экран блокирует. Существует шесть категорий, описанных в Ответе на Прерывания. Можно подстроить поведение некоторых категорий, как объяснено в Режимах Использования для Специализации Категории. |
Обработка прерываний и изменений маршрута | Ваш аудио сеанс добавляет сообщения, когда Ваше аудио прервано, когда прерывание заканчивается, и когда аппаратные изменения маршрута аудио. Эти сообщения позволяют Вам корректно реагировать на изменения в большей аудиосреде — такие как прерывание вследствие входящего телефонного вызова. Для получения дополнительной информации посмотрите Обрабатывающие Аудио Аппаратные Изменения маршрута и Аудио Инструкции Типом приложения. |
Оптимизация для характеристик оборудования | Можно запросить аудио сеанс для обнаружения характеристик устройства, на котором приложение работает, такие как аппаратная частота дискретизации, число аппаратных каналов, и доступен ли аудиовход. Для получения дополнительной информации посмотрите Оптимизацию для Оборудования устройства. |
Существует два интерфейса для работы с аудио сеансом:
Оптимизированный, объективный-C интерфейс, предоставляющий Вам доступ к базовым аудио функциям сеанса и описанный в Ссылке на протокол Ссылки класса и AVAudioSessionDelegate AVAudioSession.
Интерфейс на базе С, обеспечивающий всесторонний доступ к весь основной и усовершенствовавший аудио функции сеанса и описан в Аудио Ссылке Сеансовых служб.
Вы можете код сеанса аудио смешивания и подгонки от Основы AV и Аудио Сеансовых служб — интерфейсы абсолютно совместимы.
Аудио сеанс идет с некоторым поведением по умолчанию, которое можно использовать для начала работы в разработке. Однако за исключением определенных особых случаев, поведение по умолчанию является неподходящим для поставляющего приложения, использующего аудио.
Например, когда период Автоблокировки испытывает таймаут и экранные блокировки, при использовании аудио сеанса по умолчанию останавливается аудио в Вашем приложении. Если Вы хотите гарантировать, что воспроизведение продолжает заблокированный экран, включайте следующие строки в код инициализации своего приложения:
NSError *setCategoryErr = nil; |
NSError *activationErr = nil; |
[[AVAudioSession sharedInstance] |
setCategory: AVAudioSessionCategoryPlayback |
error: &setCategoryErr]; |
[[AVAudioSession sharedInstance] |
setActive: YES |
error: &activationErr]; |
AVAudioSessionCategoryPlayback
категория гарантирует, что воспроизведение продолжается, когда экран блокирует. Активация аудио сеанса осуществляет указанную категорию.
Как Вы обрабатываете прерывание, вызванное входящим телефонным вызовом, или предупреждение Часов или Календаря зависит от аудио технологии, которую Вы используете, как показано в Таблице 1-4.
Аудио технология | Как работают прерывания |
---|---|
Платформа Основы AV | Если Вы хотите сохранить и восстановить позицию воспроизведения между запусками приложения, сохраните позицию воспроизведения на прерывании, а также на выходе приложения. |
Audio Queue Services, аудиоустройство I/O | Эти технологии помещают Ваше приложение в управление обработки прерываний. Вы ответственны за сохранение воспроизведения или запись позиции и повторную активацию Вашего аудио сеанса после того, как закончится прерывание. Реализуйте |
OpenAL | При использовании OpenAL для воспроизведения реализуйте |
System Sound Services | Когда прерывание запускается, играемое использование звуков System Sound Services идет тихое. Если прерывание заканчивается, они могут автоматически использоваться снова. Приложения не могут влиять на поведение прерывания для звуков, использующих эту технологию воспроизведения. |
Каждое приложение для iOS — за редким исключением — должно активно управлять своим аудио сеансом. Для полного объяснения того, как сделать это, считайте Аудио Руководство по программированию Сеанса. Чтобы гарантировать, что Ваше приложение соответствует рекомендациям Apple для аудио поведения сеанса, считайте Soundin Инструкции по Интерфейсу пользователя iOS.
Игра аудио
Этот раздел представляет Вас игре звуков в iOS с помощью библиотечного доступа iPod, System Sound Services, Audio Queue Services, платформы Основы AV и OpenAL.
Игра Аудио Элементов с Библиотечным доступом iPod
Запускаясь в iOS 3.0, библиотечный доступ iPod позволяет Вашему приложению играть песни пользователя, аудиокниги и аудиоподкасты. Проект API делает основное воспроизведение очень простым, также поддерживая усовершенствованный поиск и управление воспроизведением.
Как показано на рисунке 1-1, Ваше приложение имеет два способа получить элементы носителей. Средство выбора элемента носителей, показанное слева, является простым в использовании, предварительно упакованным контроллером представления, ведущим себя как встроенный интерфейс выбора музыки приложения iPod. Для многих приложений это достаточно. Если средство выбора не обеспечивает специализированное управление доступом, Вы хотите, интерфейс мультимедийного запроса будет. Это поддерживает основанную на предикате спецификацию элементов от библиотеки iPod.
Как изображено в числе направо от Вашего приложения, Вы тогда играете полученные элементы носителей с помощью аудиоплеера, предоставленного этим API.
Для полного объяснения того, как добавить воспроизведение элемента носителей к Вашему приложению, см. Руководство по программированию Библиотечного доступа iPod. Для примера кода см. проект примера кода AddMusic.
Игра звуковых эффектов UI или вызов вибрации Используя системные службы звука
Играть звуковые эффекты пользовательского интерфейса (такие как нажатия кнопок) или вызвать вибрацию на устройства, поддерживающие его, System Sound Services использования. Этот компактный интерфейс описан в Ссылке System Sound Services. Можно счесть пример кода в Аудио Звуками UI (SysSound) выборка в iOS Центр Dev.
AudioServicesPlaySystemSound
функция позволяет Вам очень просто играть короткие звуковые файлы. Простота переносит с ним несколько ограничений. Ваши звуковые файлы должны быть:
Больше, чем 30 секунд в продолжительности
В линейном PCM или IMA4 (IMA/ADPCM) формат
Упакованный в a
.caf
,.aif
, или.wav
файл
Кроме того, когда Вы используете AudioServicesPlaySystemSound
функция:
Звуки играют в громкости существующей системы без программируемого доступного регулятора громкости
Звуки сразу играют
Цикличное выполнение и расположение стерео недоступны
Одновременное воспроизведение недоступно: можно играть только один звук за один раз
Подобное AudioServicesPlayAlertSound
функционируйте играет короткий звук как предупреждение. Если пользователь сконфигурировал их устройство для вибрирования в Кольцевых Настройках, вызывание этой функции вызывает вибрацию в дополнение к игре звукового файла.
Играть звук с AudioServicesPlaySystemSound
или AudioServicesPlayAlertSound
функция, сначала создайте звуковой объект ID, как показано в Перечислении 1-1.
Перечисление 1-1 , Создающее звуковой объект ID
// Get the main bundle for the app |
CFBundleRef mainBundle = CFBundleGetMainBundle (); |
// Get the URL to the sound file to play. The file in this case |
// is "tap.aif" |
soundFileURLRef = CFBundleCopyResourceURL ( |
mainBundle, |
CFSTR ("tap"), |
CFSTR ("aif"), |
NULL |
); |
// Create a system sound object representing the sound file |
AudioServicesCreateSystemSoundID ( |
soundFileURLRef, |
&soundFileObject |
); |
Тогда играйте звук, как показано в Перечислении 1-2.
Перечисление 1-2 Играя системный звук
- (IBAction) playSystemSound { |
AudioServicesPlaySystemSound (self.soundFileObject); |
} |
В типичном использовании, включающем игру звука иногда или неоднократно, сохраняют звуковой объект ID до Ваших выходов приложения. Если Вы знаете об использовании звука только один раз — например, в случае звука запуска — можно сразу уничтожить звуковой объект ID после игры звука, освободив память.
Приложения, работающие на устройствах на iOS, поддерживающих вибрацию, могут инициировать то использование функции System Sound Services. Вы указываете вибрировать опцию с kSystemSoundID_Vibrate
идентификатор. Для инициирования его используйте AudioServicesPlaySystemSound
функция, как показано в Перечислении 1-3.
Перечисление 1-3 , Инициировавшее вибрацию
#import <AudioToolbox/AudioToolbox.h> |
#import <UIKit/UIKit.h> |
- (void) vibratePhone { |
AudioServicesPlaySystemSound (kSystemSoundID_Vibrate); |
} |
Если Ваше приложение работает на iPod touch, этот код ничего не делает.
Игра звуков легко с классом AVAudioPlayer
AVAudioPlayer
класс обеспечивает простой интерфейс Objective-C для игры звуков. Если Ваше приложение не требует расположения стерео или точной синхронизации, и если Вы не играете аудио, полученное от сетевого потока, Apple рекомендует использовать этот класс для воспроизведения.
Используя аудиоплеер Вы можете:
Звуки игры любой продолжительности
Игра звучит от файлов или буферов памяти
Звуки цикла
Играйте многократные звуки одновременно (несмотря на то, что не с точной синхронизацией)
Управляйте относительным уровнем воспроизведения для каждого звука, который Вы играете
Ищите на определенную точку в звуковом файле, поддерживающем функции приложения, такие как ускоренная перемотка и перемотка
Получите данные мощности звука, которые можно использовать для измерения уровня звука
AVAudioPlayer
класс позволяет Вам играть звук в любом формате аудио, доступном в iOS, как описано в Таблице 1-1. Для полного описания интерфейса этого класса посмотрите Ссылку класса AVAudioPlayer.
Сконфигурировать аудиоплеер:
Присвойте звуковой файл аудиоплееру.
Подготовьте аудиоплеер к воспроизведению, получающему аппаратные ресурсы, в которых это нуждается.
Назовите делегата аудиоплеера объектом, обрабатывающим прерывания, а также завершенное воспроизведением событие.
Код в Перечислении 1-4 иллюстрирует эти шаги. Это обычно входило бы в метод инициализации класса контроллера для Вашего приложения. (В производственном коде Вы включали бы надлежащую обработку ошибок.)
Перечисление 1-4 , Конфигурирующее объект AVAudioPlayer
// in the corresponding .h file: |
// @property (nonatomic, retain) AVAudioPlayer *player; |
// in the .m file: |
@synthesize player; // the player object |
NSString *soundFilePath = |
[[NSBundle mainBundle] pathForResource: @"sound" |
ofType: @"wav"]; |
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; |
AVAudioPlayer *newPlayer = |
[[AVAudioPlayer alloc] initWithContentsOfURL: fileURL |
error: nil]; |
[fileURL release]; |
self.player = newPlayer; |
[newPlayer release]; |
[player prepareToPlay]; |
[player setDelegate: self]; |
Делегат (который может быть Вашим объектом контроллера) обрабатывает прерывания и обновляет пользовательский интерфейс, когда звук закончил играть. Методы делегата для AVAudioPlayer
класс описан в Ссылке на протокол AVAudioPlayerDelegate. Перечисление 1-5 показывает простую реализацию одного метода делегата. Когда звук закончил играть, этот код обновляет заголовок выключателя Play/Pause.
Перечисление 1-5 Реализовывая метод делегата AVAudioPlayer
- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player |
successfully: (BOOL) completed { |
if (completed == YES) { |
[self.button setTitle: @"Play" forState: UIControlStateNormal]; |
} |
} |
Для игры приостановитесь или остановитесь AVAudioPlayer
объект, вызовите один из его методов управления воспроизведением. Можно протестировать, происходит ли воспроизведение при помощи playing
свойство. Перечисление 1-6 показывает основной метод переключателя игры/паузы, что воспроизведение средств управления и обновляет заголовок a UIButton
объект.
Перечисление 1-6 , Управляющее объектом AVAudioPlayer
- (IBAction) playOrPause: (id) sender { |
// if already playing, then pause |
if (self.player.playing) { |
[self.button setTitle: @"Play" forState: UIControlStateHighlighted]; |
[self.button setTitle: @"Play" forState: UIControlStateNormal]; |
[self.player pause]; |
// if stopped or paused, start playing |
} else { |
[self.button setTitle: @"Pause" forState: UIControlStateHighlighted]; |
[self.button setTitle: @"Pause" forState: UIControlStateNormal]; |
[self.player play]; |
} |
} |
AVAudioPlayer
класс использует Objective C, объявил функцию свойств управления информацией о звуке — таком как точка воспроизведения во временной шкале звука, и для доступа к опциям воспроизведения — таким как объем и цикличное выполнение. Например, можно установить громкость воспроизведения для аудиоплеера как показано здесь:
[self.player setVolume: 1.0]; // available range is 0.0 through 1.0 |
Для получения дополнительной информации о AVAudioPlayer
класс, посмотрите Ссылку класса AVAudioPlayer.
Игра звуков с управлением Используя службы аудио-очереди
Audio Queue Services добавляет возможности воспроизведения вне доступных с AVAudioPlayer
класс. Using Audio Queue Services для воспроизведения позволяет Вам:
Точно запланируйте, когда звук будет играть, позволяя синхронизацию
Точно управляйте объемом на основе буфера буфером
Играйте аудио, что Вы получили от потокового использования Audio File Stream Services
Audio Queue Services позволяет Вам играть звук в любом формате аудио, доступном в iOS, как описано в Таблице 1-1. Можно также использовать эту технологию для записи, как объяснено в Записи Аудио.
Для получения дальнейшей информации при использовании этой технологии, посмотрите Ссылку Audio Queue Services Programming Guide and Audio Queue Services. Для примера кода посмотрите выборку SpeakHere.
Создание объекта аудио-очереди
Для создания объекта аудио-очереди для воспроизведения выполните эти три шага:
Создайте структуру данных для управления информацией, необходимой аудио-очереди, такой как формат аудио для данных, которые Вы хотите играть.
Определите функцию обратного вызова для управления буферами аудио-очереди. Обратный вызов использует Audio File Services для чтения файла, который Вы хотите играть. (В iOS 2.1 и позже, можно также использовать Extended Audio File Services для чтения файла.)
Инстанцируйте аудио-очереди воспроизведения с помощью
AudioQueueNewOutput
функция.
Перечисление 1-7 иллюстрирует эти шаги с помощью ANSI C. (В производственном коде, Вы включали бы надлежащую обработку ошибок.) Демонстрационный проект SpeakHere показывает эти те же шаги в контексте программы C++.
Перечисление 1-7 , Создающее объект аудио-очереди
static const int kNumberBuffers = 3; |
// Create a data structure to manage information needed by the audio queue |
struct myAQStruct { |
AudioFileID mAudioFile; |
CAStreamBasicDescription mDataFormat; |
AudioQueueRef mQueue; |
AudioQueueBufferRef mBuffers[kNumberBuffers]; |
SInt64 mCurrentPacket; |
UInt32 mNumPacketsToRead; |
AudioStreamPacketDescription *mPacketDescs; |
bool mDone; |
}; |
// Define a playback audio queue callback function |
static void AQTestBufferCallback( |
void *inUserData, |
AudioQueueRef inAQ, |
AudioQueueBufferRef inCompleteAQBuffer |
) { |
myAQStruct *myInfo = (myAQStruct *)inUserData; |
if (myInfo->mDone) return; |
UInt32 numBytes; |
UInt32 nPackets = myInfo->mNumPacketsToRead; |
AudioFileReadPackets ( |
myInfo->mAudioFile, |
false, |
&numBytes, |
myInfo->mPacketDescs, |
myInfo->mCurrentPacket, |
&nPackets, |
inCompleteAQBuffer->mAudioData |
); |
if (nPackets > 0) { |
inCompleteAQBuffer->mAudioDataByteSize = numBytes; |
AudioQueueEnqueueBuffer ( |
inAQ, |
inCompleteAQBuffer, |
(myInfo->mPacketDescs ? nPackets : 0), |
myInfo->mPacketDescs |
); |
myInfo->mCurrentPacket += nPackets; |
} else { |
AudioQueueStop ( |
myInfo->mQueue, |
false |
); |
myInfo->mDone = true; |
} |
} |
// Instantiate an audio queue object |
AudioQueueNewOutput ( |
&myInfo.mDataFormat, |
AQTestBufferCallback, |
&myInfo, |
CFRunLoopGetCurrent(), |
kCFRunLoopCommonModes, |
0, |
&myInfo.mQueue |
); |
Управление уровнем воспроизведения
Объекты аудио-очереди дают Вам два способа управлять уровнем воспроизведения.
Для установки уровня воспроизведения непосредственно используйте AudioQueueSetParameter
функция с kAudioQueueParam_Volume
параметр, как показано в Перечислении 1-8. Изменение уровня сразу вступает в силу.
Перечисление 1-8 , Устанавливающее уровень воспроизведения непосредственно
Float32 volume = 1; // linear scale, range from 0.0 through 1.0 |
AudioQueueSetParameter ( |
myAQstruct.audioQueueObject, |
kAudioQueueParam_Volume, |
volume |
); |
Можно также установить уровень воспроизведения для буфера аудио-очереди при помощи AudioQueueEnqueueBufferWithParameters
функция. Это позволяет Вам присвоить настройки аудио-очереди, которые, в действительности, переносит буфер аудио-очереди, поскольку Вы ставите в очередь его. Когда буфер начинает играть, такие изменения вступают в силу.
В обоих случаях изменения уровня для аудио-очереди остаются в силе, пока Вы не изменяете их снова.
Указание уровня воспроизведения
Можно получить текущий уровень воспроизведения из объекта аудио-очереди:
Включение измеряющий для аудио-очереди возражает путем установки
kAudioQueueProperty_EnableLevelMetering
свойство кtrue
Запросы объекта аудио-очереди
kAudioQueueProperty_CurrentLevelMeter
свойство
Значение этого свойства является массивом AudioQueueLevelMeterState
структуры, один на канал. Перечисление 1-9 показывает эту структуру:
Перечисление 1-9 AudioQueueLevelMeterState
структура
typedef struct AudioQueueLevelMeterState { |
Float32 mAveragePower; |
Float32 mPeakPower; |
}; AudioQueueLevelMeterState; |
Игра многократных звуков одновременно
Для игры многократных звуков одновременно создайте один объект аудио-очереди воспроизведения для каждого звука. Для каждой аудио-очереди запланируйте первый буфер аудио, чтобы начать одновременно использовать AudioQueueEnqueueBufferWithParameters
функция.
При запуске в iOS 3.0 почти все поддерживаемые форматы аудио могут использоваться для одновременного воспроизведения — а именно, все те, которые могут играться с помощью декодирования программного обеспечения, как описано в Таблице 1-1. Для самого эффективного процессором многократного воспроизведения используйте линейный (несжатый) PCM, или IMA4 (сжал) аудио.
Игра звуков с расположением Используя OpenAL
Открыто полученное аудио OpenAL API, доступный в iOS в платформе OpenAL, обеспечивает интерфейс, оптимизированный для расположения звуков в стереополе во время воспроизведения. Игра, располагая и перемещая звуки работает, как она делает на других платформах. OpenAL также позволяет Вам смешать звуки. OpenAL использует модуль I/O для воспроизведения, приводящего к самой низкой задержке.
По всем этим причинам OpenAL является Вашим лучшим выбором для игры звуков в игровых приложениях на основанных на iOS устройствах. Однако OpenAL является также хорошим выбором для общих потребностей воспроизведения аудио приложения для iOS.
Поддержка OpenAL 1.1 в iOS создается поверх Core Audio. Для получения дополнительной информации посмотрите OpenAL FAQ для iPhone OS. Для примера кода см. oalTouch.
Запись аудио
iOS поддерживает аудиозапись с помощью AVAudioRecorder
класс и Audio Queue Services. Эти интерфейсы выполняют работу соединения с аудио аппаратными средствами, управления памятью и использования кодеков по мере необходимости. Можно записать аудио в любом из форматов, перечисленных в Таблице 1-2.
Запись имеет место на определенном с помощью системы уровне на входе в iOS. Система берет ввод из источника аудиосигналов, который пользователь выбрал — встроенный микрофон или, если соединено, микрофон гарнитуры или другой входной источник.
Запись с классом AVAudioRecorder
Самый простой способ записать звук в iOS с AVAudioRecorder
класс, описанный в Ссылке класса AVAudioRecorder. Этот класс обеспечивает высоко оптимизированный, интерфейс Objective-C, упрощающий обеспечивать сложные функции как приостановка/возобновление записи и обработка прерываний звука. Одновременно, Вы сохраняете полный контроль над форматом записи.
Подготавливаться к записи использования магнитофона:
Укажите звуковой файл URL.
Установите аудио сеанс.
Сконфигурируйте начальное состояние магнитофона.
Запуск приложения является хорошим временем, чтобы внести свой вклад из установки, как показано в Перечислении 1-10. Переменные такой как soundFileURL
и recording
в этом примере объявляются в интерфейсе класса. (В производственном коде Вы включали бы надлежащую обработку ошибок.)
Перечисление 1-10 , Настраивающее аудио сеанс и звуковой файл URL
- (void) viewDidLoad { |
[super viewDidLoad]; |
NSString *tempDir = NSTemporaryDirectory (); |
NSString *soundFilePath = |
[tempDir stringByAppendingString: @"sound.caf"]; |
NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; |
self.soundFileURL = newURL; |
[newURL release]; |
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; |
audioSession.delegate = self; |
[audioSession setActive: YES error: nil]; |
recording = NO; |
playing = NO; |
} |
Для обработки прерываний и завершения записи добавьте AVAudioSessionDelegate
и AVAudioRecorderDelegate
протокол называет к объявлению интерфейса для Вашей реализации. Если Ваше приложение также воспроизводит, также примите AVAudioPlayerDelegate Protocol Reference
протокол.
Для реализации рекордного метода можно использовать код, такой как показанный в Перечислении 1-11. (В производственном коде Вы включали бы надлежащую обработку ошибок.)
Перечисление 1-11 метод записи/остановки с помощью класса AVAudioRecorder
- (IBAction) recordOrStop: (id) sender { |
if (recording) { |
[soundRecorder stop]; |
recording = NO; |
self.soundRecorder = nil; |
[recordOrStopButton setTitle: @"Record" forState: |
UIControlStateNormal]; |
[recordOrStopButton setTitle: @"Record" forState: |
UIControlStateHighlighted]; |
[[AVAudioSession sharedInstance] setActive: NO error: nil]; |
} else { |
[[AVAudioSession sharedInstance] |
setCategory: AVAudioSessionCategoryRecord |
error: nil]; |
NSDictionary *recordSettings = |
[[NSDictionary alloc] initWithObjectsAndKeys: |
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey, |
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, |
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey, |
[NSNumber numberWithInt: AVAudioQualityMax], |
AVEncoderAudioQualityKey, |
nil]; |
AVAudioRecorder *newRecorder = |
[[AVAudioRecorder alloc] initWithURL: soundFileURL |
settings: recordSettings |
error: nil]; |
[recordSettings release]; |
self.soundRecorder = newRecorder; |
[newRecorder release]; |
soundRecorder.delegate = self; |
[soundRecorder prepareToRecord]; |
[soundRecorder record]; |
[recordOrStopButton setTitle: @"Stop" forState: UIControlStateNormal]; |
[recordOrStopButton setTitle: @"Stop" forState: UIControlStateHighlighted]; |
recording = YES; |
} |
} |
Для получения дополнительной информации о AVAudioRecorder
класс, посмотрите Ссылку класса AVAudioRecorder.
Запись со службами аудио-очереди
Для установки для записи с аудио с Audio Queue Services приложение инстанцирует объекта аудио-очереди записи и обеспечивает функцию обратного вызова. Хранилища обратного вызова, поступающие аудиоданные в памяти для непосредственного использования или записей это к файлу для долгосрочного хранения.
Так же, как с воспроизведением, можно получить текущий уровень звука записи из объекта аудио-очереди путем запросов kAudioQueueProperty_CurrentLevelMeter
свойство, как описано в Указании Уровня Воспроизведения.
Для подробных примеров того, как использовать Audio Queue Services для записи аудио, посмотрите Аудио Записи в Руководстве по программированию Audio Queue Services. Для примера кода посмотрите выборку SpeakHere.
Парсинг переданного потоком аудио
Играть переданное потоком звуковое содержимое, такой как от сетевого соединения, Audio File Stream Services использования совместно с Audio Queue Services. Audio File Stream Services анализирует аудио пакеты и метаданные от общих форматов контейнера аудиофайла в сетевом потоке битов. Можно также использовать его для парсинга пакетов и метаданных от дисковых файлов.
В iOS можно проанализировать тот же аудиофайл и передать поток битов форматы, что Вы можете в Mac OS X, следующим образом:
Уровень 3 Аудио MPEG 1, используемый для .mp3 файлов
MPEG 2 ADTS, используемый для .aac формата аудиоданных
AIFC
AIFF
CAF
MPEG 4, используемый для .m4a, .mp4, и.3gp файлы
NeXT
WAVE
Получив аудио пакеты, можно воспроизвести восстановленный звук в любом из форматов, поддерживаемых в iOS, как перечислено в Таблице 1-1.
Для лучшей производительности приложения потоковой передачи сети должны использовать данные от соединений Wi-Fi. iOS позволяет Вам определить, какие сети достижимы и доступны через его платформу Конфигурации системы и его SCNetworkReachabilityRef
непрозрачный тип, описанный в Ссылке SCNetworkReachability. Для примера кода посмотрите выборку Достижимости в iOS Центр Dev.
Для соединения с сетевым потоком используйте интерфейсы от Базовой Основы, такие как та, описанная в Ссылке CFHTTPMessage. Проанализируйте сетевые пакеты для восстановления аудио пакетного использования Audio File Stream Services. Тогда буферизуйте аудио пакеты и отправьте их в объект аудио-очереди воспроизведения.
Audio File Stream Services полагается на интерфейсы от Audio File Services, такой как AudioFramePacketTranslation
структура и AudioFilePacketTableInfo
структура. Они описаны в Ссылке Audio File Services.
Для получения дополнительной информации об использовании потоков обратитесь к Ссылке Audio File Stream Services.
Поддержка Аудиоустройства в iOS
iOS обеспечивает ряд плагинов обработки аудиоданных, известных как аудиоустройства, которые можно использовать в любом приложении. Интерфейсы в платформе Аудиоустройства позволяют Вам открыть, подключить и использовать эти аудиоустройства.
Для использования функций платформы Аудиоустройства добавьте Аудио платформу Панели инструментов к проекту XCode и ссылке против него в любых соответствующих целях. Тогда добавьте a #import <AudioToolbox/AudioToolbox.h>
оператор около вершины файлов соответствующего источника. Для получения дальнейшей информации о том, как добавить платформы к Вашему проекту, посмотрите Файлы в Проектах в Руководстве по управлению проектами XCode.
Таблица 1-5 перечисляет аудиоустройства, предоставленные в iOS.
Аудиоустройство | Описание |
---|---|
модуль Эквалайзера iPod | IPod модуль EQ, типа |
3D модуль Микшера | 3D модуль Микшера, типа |
Многоканальный модуль Микшера | Многоканальный модуль Микшера, типа |
Удаленный модуль I/O | Удаленный модуль I/O, типа |
Речь , Обрабатывающая модуль I/O | Речь, Обрабатывающая модуль I/O, типа |
Универсальное Устройство вывода | Универсальное Устройство вывода, типа |
Преобразователь | Преобразователь, типа |
Для получения дополнительной информации об использовании системных аудиоустройств посмотрите, что Аудиоустройство Размещает Руководство для iOS. Для справочной документации посмотрите Ссылку Audio Unit Framework Reference and Audio Unit Processing Graph Services. Центр Dev iOS обеспечивает два проекта примера кода, демонстрирующие использование системных аудиоустройств: aurioTouch и iPhoneMultichannelMixerTest.
Методы наиболее успешной практики для Аудио iOS
Этот раздел перечисляет некоторые важные подсказки для использования аудио в iOS и описывает лучшие форматы аудиоданных для различного использования.
Подсказки для Использования аудио
Таблица 1-6 перечисляет некоторые важные подсказки для учета при использовании аудио в iOS.
Подсказка | Действие |
---|---|
Используйте сжатое аудио соответственно | Для AAC, MP3 и ALAC (Apple Lossless) аудио, декодирование может иметь место с помощью помогших с аппаратными средствами кодеков. В то время как эффективный, это ограничивается одним аудиопотоком за один раз. Если необходимо играть многократные звуки одновременно, сохраните те звуки с помощью IMA4 (сжатый) или линейный PCM (несжатый) формат. |
Преобразуйте в формат данных и формат файла, в котором Вы нуждаетесь | |
Оцените аудио проблемы памяти | При игре звука с Audio Queue Services Вы пишете обратный вызов, отправляющий короткие сегменты аудиоданных к буферам аудио-очереди. В некоторых случаях загрузка всего звукового файла к памяти для воспроизведения, минимизирующего доступ к диску, является лучшей. В других случаях, загружая как раз достаточно данных за один раз для хранения буферов полными является лучшим. Протестируйте и оцените, какая стратегия работает лучше всего на Ваше приложение. |
Сократите размеры аудиофайла путем ограничения частот дискретизации, битовых глубин и каналов | Частота дискретизации и число битов на выборку оказывают непосредственное влияние на размер Ваших аудиофайлов. Если необходимо играть много таких звуков или долговременные звуки, полагайте, что сокращение этих значений сокращает объем потребляемой памяти аудиоданных. Например, вместо того, чтобы использовать частоту дискретизации на 44,1 кГц для звуковых эффектов, Вы могли использовать 32 кГц (или возможно понизиться), частота дискретизации, и все еще обеспечьте разумное качество. Используя монофоническое (одноканальное) аудио вместо стерео (два образовывают канал) сокращает размер файла. Для каждого звукового актива рассмотрите, мог ли бы моно удовлетворить Вашим потребностям. |
Выберите соответствующую технологию | Используйте OpenAL, когда Вы хотите удобный, высокоуровневый интерфейс для расположения звуков в стереополе или когда Вам нужно низкое воспроизведение задержки. Для парсинга аудио пакетов от файла или сетевого потока используйте Audio File Stream Services. Для простого воспроизведения единственных или многократных звуков используйте |
Код для низкой задержки | Для самой низкой задержки воспроизведения используйте OpenAL или используйте модуль I/O непосредственно. |
Предпочтительные Форматы аудио в iOS
Для несжатого аудио (высшего качества) используйте 16-разрядные, линейные аудиоданные PCM с прямым порядком байтов, упакованные в файле CAF. Можно преобразовать аудиофайл в этот формат в Mac OS X с помощью afconvert
инструмент командной строки, как показано здесь:
/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT} |
afconvert
инструмент позволяет Вам преобразовать в широкий диапазон форматов аудиоданных и типов файлов. Посмотрите afconvert
страница справочника, и входит afconvert -h
при приглашении оболочки, для получения дополнительной информации.
Для сжатого аудио при игре одного звука за один раз, и когда Вы не должны играть аудио одновременно с приложением iPod, используют формат AAC, упакованный в CAF или m4a файле.
Для меньшего количества использования памяти, когда необходимо будет играть многократные звуки одновременно, используйте IMA4 (IMA/ADPCM) сжатие. Это сокращает размер файла, но влечет за собой минимальное влияние на ЦП во время распаковки. Как с линейными данными PCM, пакет данные IMA4 в файле CAF.