|
Авг
17
|
Представленный в iPhone SDK фреймворк “AVFoundation” включает “AVAudioPlayer” — простое многофункциональное решение для воспроизведения аудиофайлов на базе Objective-C.
В этом уроке мы познакомимся с его работой, создав простое приложение, циклически воспроизводящее MP3 аудиофайл после запуска.
Источник/Github
Код к уроку можно получить на GitHub: клонируйте его из репозитория или загрузите zip-архив.
Создание проекта
Запустив Xcode, создайте новое приложение на основе представления с именем AudioPlayer:
1. Командой “File > New Project…” из меню Xcode создайте новый проект.
2. В разделе “iPhone OS > Application” выберите “View-based Application“.
3. Присвойте проекту имя “AudioPlayer” и щелкните на кнопке “Save“.
Добавление фреймворка AVFoundation
Чтобы задействовать класс “AVAudioPlaye“, необходимо добавить к проекту фреймворк “AVFoundation“.
1. На относящейся к проекту панели “Groups & Files” разверните группу “Targets“.
2. Правой кнопкой мыши или удерживая нажатой клавишу , щелкните на элементе AudioPlayer.
3. Выберите “Add > Existing Frameworks…“.
4. Внизу слева (под опцией “Linked Libraries“) щелкните на кнопке “+“.
5. Выберите “AVFoundation.framework” и щелкните на кнопке “Add“.
6. Теперь “AVFoundation.framework” появится в разделе “Linked Libraries“. Закройте окно.
Следующим шагом импортируем заголовочные файлы “AVFoundation” в файл интерфейса контроллера представления и настроим экземпляр переменной “AVAudioPlayer“:
1. На относящейся к проекту панели “Groups & Files” разверните группу “AudioPlayer“.
2. Разверните папку “Classes“.
3. Выделив файл “AudioPlayerViewController.h“, отредактируйте его.
4. Обновите файл. Изменения выделены черным:
1 2 3 4 5 6 7 8 | #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface AudioPlayerViewController : UIViewController { AVAudioPlayer *audioPlayer; } @end |
Добавление аудиофайла
Для воспроизведения нам понадобится аудиофайл. Не претендуя на особую оригинальность, назовем его “audiofile.mp3“. Добавьте файл к проекту:
1. На относящейся к проекту панели “Groups & Files” щелкните на папке “Resources” правой кнопкой мыши или удерживая нажатой клавишу .
2. Из появившегося контекстного меню выберите “Add > Existing Files…“.
3. Найдите и выделите импортируемый файл, щелкните на опции “Add“.
4. Установите флажок “Copy items into destination group’s folder (if needed)” и подтвердите кнопкой “Add“.
Запускаем воспроизведение звука
Начинаем воспроизведение в методе “ViewDidLoad“:
1. Откомментируйте шаблон метода “ViewDidLoad“.
2. Обновите его, как показано ниже. Изменения выделены черным.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audiofile.mp3", [[NSBundle mainBundle] resourcePath]]]; NSError *error; audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; audioPlayer.numberOfLoops = -1; if (audioPlayer == nil) NSLog([error description]); else [audioPlayer play]; } |
“AVAudioPlayer” инициализируется URL-ссылкой, поэтому создадим ссылку, указывающую на аудиофайл в локальной папке с ресурсами. Если для аудиоплейера свойство “numberOfLoops” сделать отрицательным числом, файл будет воспроизводиться бесконечно. Настроив плейер, запускаем воспроизведение, отправив объекту соответствующее сообщение.
Не забудьте освободить “audioPlayer” в методе “dealloc“. Изменения показаны черным.
1 2 3 4 | - (void)dealloc { [audioPlayer release]; [super dealloc]; } |
Дополнительные возможности
Регулируется громкость плейера, проверяется /настраивается время воспроизведения, предусмотрены остановка и пауза:
1 2 3 4 5 | audioPlayer.volume = 0.5; // 0.0 – нет звука; 1.0 полная громкость NSLog(@"%f seconds played so far", audioPlayer.currentTime); audioPlayer.currentTime = 10; // перейти к 10-секундной отметке [audioPlayer pause]; [audioPlayer stop]; // не восстанавливает "currentTime"; возобновляет воспроизведение |
Помимо прочего, можно внедрить протокол “AVAudioPlayerDelegate“, уведомляющий об окончании воспроизведения аудио — например, для перехода к следующей по списку композиции.



Август 17th, 2009 at 20:52
Обязательно ли использовать мп3?Возможно ли воспроизводить др. расширения?
Август 22nd, 2009 at 11:00
Да конечно можно.
Правильнее при viewDidLoad инициализировать звуки и делать [audioPlayer prepareToPlay];
А то каждый раз будет немного тормозить при загрузке звука, особенно если файл большой.
Ноябрь 12th, 2009 at 10:14
Такая проблема-если была включена музыка на айфоне, а затем запустить приложение с приведенным исходным кодом-музыка на фоне умолкает? Что делать?- нужно чтобы играло оба звука.
Ноябрь 12th, 2009 at 10:19
проблема - если была запущена музыка на айфоне, а затем запустить приложение с указанным выше кодом, она играть прекратит. Как сделать чтоьы проигрывалось оба звука? Например, игрок хочет играть в любимую игру под любимую музыку))
Ноябрь 20th, 2009 at 14:20
При использовании AVAudioPlayer’a ловлю leak (при том как в своём приложении, так и в приведённом выше примере), на буржуйских форумах читал что у половины этот лик есть у другой нету (неизвестно почему)
Может кто-нить знает как от него избавиться??
Декабрь 2nd, 2009 at 08:48
Чтобы проигрывалось оба звука нужно правильно настроить аудио сессию. Перед инициализацией плеера добавь [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
Вроде должно работать.