Используя аудио

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

Чтобы позволить Вашему коду использовать функции аудио платформы, добавьте, что платформа к Вашему проекту XCode, ссылке против него в любых соответствующих целях, и добавляет надлежащее #import оператор около вершины файлов соответствующего источника. Например, для обеспечения доступа к платформе Основы AV в исходном файле добавьте a #import <AVFoundation/AVFoundation.h> оператор около вершины файла. Для получения дальнейшей информации о том, как добавить платформы к Вашему проекту, посмотрите Файлы в Проектах в Руководстве по управлению проектами XCode.

Этот раздел по звуку обеспечивает краткое введение в реализацию функций аудио iOS, как перечислено здесь:

Обязательно считайте следующий раздел, Основы: Аудиокодеки, Поддерживаемые Форматы аудио и Одио Сешнз, для критической информации о том, как аудио работает в iOS. Также считайте Методы наиболее успешной практики для iOS Одио, предлагающий инструкции и перечисляющий форматы аудио и форматы файлов для использования для лучшей производительности и лучшего пользовательского опыта.

Когда Вы готовы вырыть глубже, iOS, Центр Dev содержит руководства, справочники, пример кода и т.д. Для всесторонних объяснений аудио разработки в iOS, видит Обзор Core Audio, Аудио Руководство по программированию Сеанса, Руководство по программированию Audio Queue Services, Руководство по Хостингу Аудиоустройства для iOS и Руководство по программированию Библиотечного доступа iPod.

Основы: аудиокодеки, поддерживаемые форматы аудио и аудио сеансы

Чтобы быть ориентированным к разработке аудио iOS, важно понять несколько критических вещей об аппаратной и программной архитектуре устройств на iOS — описанный в этом разделе.

Аппаратные и программные Аудиокодеки iOS

Для обеспечения оптимальной производительности и качества необходимо выбрать правильный формат аудио и тип аудиокодека. При запуске в iOS 3.0 большинство форматов аудио может использовать основанное на программном обеспечении кодирование (для записи) и декодирование (для воспроизведения). Кодеки программного обеспечения поддерживают одновременное воспроизведение многократных звуков, но могут повлечь за собой значительный CPU наверху.

Помогшее с аппаратными средствами декодирование обеспечивает превосходную производительность — но не поддерживает одновременное воспроизведение многократных звуков. Если необходимо максимизировать частоту видеокадров в приложении, минимизировать влияние на ЦП воспроизведения аудио при помощи несжатого аудио или формата IMA4, или использовать помогшее с аппаратными средствами декодирование сжатых аудио активов.

Для уведомления наиболее успешной практики относительно выбора формата аудио посмотрите Предпочтительные Форматы аудио в iOS.

Таблица 1-1 описывает аудиокодеки воспроизведения, доступные на устройствах на iOS.

Табличные 1-1  форматы Воспроизведения аудио и кодеки

Аудио формат декодера/воспроизведения

Помогшее с аппаратными средствами декодирование

Основанное на программном обеспечении декодирование

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.

Табличные 1-2  форматы Аудиозаписи и кодеки

Аудио кодер/формат записи

Помогшее с аппаратными средствами кодирование

Основанное на программном обеспечении кодирование

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.

Табличные 1-3  Функции, предоставленные аудио сеансом APIs

Аудио функция сеанса

Описание

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

Категория является ключом, идентифицирующим ряд аудио способов поведения для Вашего приложения. Путем установки категории Вы указываете свои аудио намерения к iOS, такой как, должно ли Ваше аудио продолжаться, когда экран блокирует. Существует шесть категорий, описанных в Ответе на Прерывания. Можно подстроить поведение некоторых категорий, как объяснено в Режимах Использования для Специализации Категории.

Обработка прерываний и изменений маршрута

Ваш аудио сеанс добавляет сообщения, когда Ваше аудио прервано, когда прерывание заканчивается, и когда аппаратные изменения маршрута аудио. Эти сообщения позволяют Вам корректно реагировать на изменения в большей аудиосреде — такие как прерывание вследствие входящего телефонного вызова. Для получения дополнительной информации посмотрите Обрабатывающие Аудио Аппаратные Изменения маршрута и Аудио Инструкции Типом приложения.

Оптимизация для характеристик оборудования

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

Существует два интерфейса для работы с аудио сеансом:

Вы можете код сеанса аудио смешивания и подгонки от Основы AV и Аудио Сеансовых служб — интерфейсы абсолютно совместимы.

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

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

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
[[AVAudioSession sharedInstance]
              setCategory: AVAudioSessionCategoryPlayback
                    error: &setCategoryErr];
[[AVAudioSession sharedInstance]
                setActive: YES
                    error: &activationErr];

AVAudioSessionCategoryPlayback категория гарантирует, что воспроизведение продолжается, когда экран блокирует. Активация аудио сеанса осуществляет указанную категорию.

Как Вы обрабатываете прерывание, вызванное входящим телефонным вызовом, или предупреждение Часов или Календаря зависит от аудио технологии, которую Вы используете, как показано в Таблице 1-4.

Таблица 1-4  , Обрабатывающая прерывания звука

Аудио технология

Как работают прерывания

  Платформа Основы AV

AVAudioPlayer и AVAudioRecorder классы обеспечивают, методы делегата для прерывания запускаются и заканчиваются. Реализуйте эти методы, чтобы обновить Ваш пользовательский интерфейс и дополнительно, после концов прерывания, возобновить приостановленное воспроизведение. Система автоматически приостанавливает воспроизведение или записывающий после прерывания, и повторно активирует Ваш аудио сеанс, когда Вы возобновляете воспроизведение или запись.

Если Вы хотите сохранить и восстановить позицию воспроизведения между запусками приложения, сохраните позицию воспроизведения на прерывании, а также на выходе приложения.

Audio Queue Services,  аудиоустройство I/O

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

OpenAL

При использовании OpenAL для воспроизведения реализуйте AVAudioSession методы делегата прерывания или запись функция обратного вызова слушателя прерывания — как тогда, когда с помощью Audio Queue Services. Однако делегат или обратный вызов должны дополнительно управлять контекстом 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.

Рисунок 1-1  Используя библиотечный доступ iPod
Using iPod library access

Как изображено в числе направо от Вашего приложения, Вы тогда играете полученные элементы носителей с помощью аудиоплеера, предоставленного этим 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. Присвойте звуковой файл аудиоплееру.

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

  3. Назовите делегата аудиоплеера объектом, обрабатывающим прерывания, а также завершенное воспроизведением событие.

Код в Перечислении 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.

Создание объекта аудио-очереди

Для создания объекта аудио-очереди для воспроизведения выполните эти три шага:

  1. Создайте структуру данных для управления информацией, необходимой аудио-очереди, такой как формат аудио для данных, которые Вы хотите играть.

  2. Определите функцию обратного вызова для управления буферами аудио-очереди. Обратный вызов использует Audio File Services для чтения файла, который Вы хотите играть. (В iOS 2.1 и позже, можно также использовать Extended Audio File Services для чтения файла.)

  3. Инстанцируйте аудио-очереди воспроизведения с помощью 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 функция. Это позволяет Вам присвоить настройки аудио-очереди, которые, в действительности, переносит буфер аудио-очереди, поскольку Вы ставите в очередь его. Когда буфер начинает играть, такие изменения вступают в силу.

В обоих случаях изменения уровня для аудио-очереди остаются в силе, пока Вы не изменяете их снова.

Указание уровня воспроизведения

Можно получить текущий уровень воспроизведения из объекта аудио-очереди:

  1. Включение измеряющий для аудио-очереди возражает путем установки kAudioQueueProperty_EnableLevelMetering свойство к true

  2. Запросы объекта аудио-очереди 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, упрощающий обеспечивать сложные функции как приостановка/возобновление записи и обработка прерываний звука. Одновременно, Вы сохраняете полный контроль над форматом записи.

Подготавливаться к записи использования магнитофона:

  1. Укажите звуковой файл URL.

  2. Установите аудио сеанс.

  3. Сконфигурируйте начальное состояние магнитофона.

Запуск приложения является хорошим временем, чтобы внести свой вклад из установки, как показано в Перечислении 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, следующим образом:

Получив аудио пакеты, можно воспроизвести восстановленный звук в любом из форматов, поддерживаемых в 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.

Таблица 1-5  Предоставленные систему аудиоустройства

Аудиоустройство

Описание

модуль Эквалайзера iPod

IPod модуль EQ, типа kAudioUnitSubType_AUiPodEQ, обеспечивает простой, основанный на предварительной установке эквалайзер, который можно использовать в приложении. Для демонстрации того, как использовать это аудиоустройство, посмотрите Тест микшера iPodEQ AUGraph проекта примера кода.

3D модуль Микшера

3D модуль Микшера, типа kAudioUnitSubType_AU3DMixerEmbedded, позволяет Вам смешать многократные аудиопотоки, указать выходное панорамирование стерео, управлять скоростью воспроизведения и т.д., OpenAL создается поверх этого аудиоустройства и обеспечивает высокоуровневый API, которому хорошо удовлетворяют для игровых приложений.

Многоканальный  модуль Микшера

Многоканальный модуль Микшера, типа kAudioUnitSubType_MultiChannelMixer, позволяет Вам смешать многократные моно или аудиопотоки стерео к единственному потоку стерео. Это также поддерживает уехавшее/исправленное панорамирование для каждого ввода. Для демонстрации того, как использовать это аудиоустройство, см. проект примера кода Аудио Микшер (MixerHost).

Удаленный  модуль I/O

Удаленный модуль I/O, типа kAudioUnitSubType_RemoteIO, подключения к аудиовходу и выходным аппаратным средствам и поддержкам I/O в реальном времени. Для демонстраций того, как использовать это аудиоустройство, см. проект примера кода aurioTouch.

Речь , Обрабатывающая  модуль I/O

Речь, Обрабатывающая модуль I/O, типа kAudioUnitSubType_VoiceProcessingIO, имеет характеристики модуля I/O и добавляет подавление эха и другие функции двухсторонней связи.

Универсальное  Устройство вывода

Универсальное Устройство вывода, типа kAudioUnitSubType_GenericOutput, преобразование поддержек в и от линейного формата PCM; может использоваться, чтобы запустить и остановить график.

Преобразователь

Преобразователь, типа kAudioUnitSubType_AUConverter, позволяет Вам преобразовать аудиоданные от одного формата до другого. Вы обычно получаете функции этого аудиоустройства при помощи Удаленного модуля I/O, включающего Преобразователь.

Для получения дополнительной информации об использовании системных аудиоустройств посмотрите, что Аудиоустройство Размещает Руководство для iOS. Для справочной документации посмотрите Ссылку Audio Unit Framework Reference and Audio Unit Processing Graph Services. Центр Dev iOS обеспечивает два проекта примера кода, демонстрирующие использование системных аудиоустройств: aurioTouch и iPhoneMultichannelMixerTest.

Методы наиболее успешной практики для Аудио iOS

Этот раздел перечисляет некоторые важные подсказки для использования аудио в iOS и описывает лучшие форматы аудиоданных для различного использования.

Подсказки для Использования аудио

Таблица 1-6 перечисляет некоторые важные подсказки для учета при использовании аудио в iOS.

Табличные 1-6  подсказки по Аудио

Подсказка

Действие

Используйте сжатое аудио соответственно

Для AAC, MP3 и ALAC (Apple Lossless) аудио, декодирование может иметь место с помощью помогших с аппаратными средствами кодеков. В то время как эффективный, это ограничивается одним аудиопотоком за один раз. Если необходимо играть многократные звуки одновременно, сохраните те звуки с помощью IMA4 (сжатый) или линейный PCM (несжатый) формат.

Преобразуйте в формат данных и формат файла, в котором Вы нуждаетесь

afconvert инструмент в Mac OS X позволяет Вам преобразовать в широкий диапазон форматов аудиоданных и типов файлов. Посмотрите Предпочтительные Форматы аудио в iOS и afconvert страница справочника.

Оцените аудио проблемы памяти

При игре звука с Audio Queue Services Вы пишете обратный вызов, отправляющий короткие сегменты аудиоданных к буферам аудио-очереди. В некоторых случаях загрузка всего звукового файла к памяти для воспроизведения, минимизирующего доступ к диску, является лучшей. В других случаях, загружая как раз достаточно данных за один раз для хранения буферов полными является лучшим. Протестируйте и оцените, какая стратегия работает лучше всего на Ваше приложение.

Сократите размеры аудиофайла путем ограничения частот дискретизации, битовых глубин и каналов

Частота дискретизации и число битов на выборку оказывают непосредственное влияние на размер Ваших аудиофайлов. Если необходимо играть много таких звуков или долговременные звуки, полагайте, что сокращение этих значений сокращает объем потребляемой памяти аудиоданных. Например, вместо того, чтобы использовать частоту дискретизации на 44,1 кГц для звуковых эффектов, Вы могли использовать 32 кГц (или возможно понизиться), частота дискретизации, и все еще обеспечьте разумное качество.

Используя монофоническое (одноканальное) аудио вместо стерео (два образовывают канал) сокращает размер файла. Для каждого звукового актива рассмотрите, мог ли бы моно удовлетворить Вашим потребностям.

Выберите соответствующую технологию

Используйте OpenAL, когда Вы хотите удобный, высокоуровневый интерфейс для расположения звуков в стереополе или когда Вам нужно низкое воспроизведение задержки. Для парсинга аудио пакетов от файла или сетевого потока используйте Audio File Stream Services. Для простого воспроизведения единственных или многократных звуков используйте AVAudioPlayer класс. Для записи к файлу используйте AVAudioRecorder класс. Для аудио чата используйте Речь, Обрабатывающую модуль I/O. Для игры аудио ресурсов, синхронизировавших от библиотеки iTunes пользователя, используйте Библиотечный доступ iPod. Когда Ваша единственная аудио потребность будет состоять в том, чтобы играть предупреждения и звуковые эффекты пользовательского интерфейса, используйте System Sound Services Core Audio. Для других аудиоприложений, включая воспроизведение переданного потоком аудио, точная синхронизация и доступ к пакетам входящего аудио, используют Audio Queue 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.