Не удалось воспроизвести звук системы после переключения на iOS 5
Вот как я воспроизвел звуковой эффект в iOS 4:
SystemSoundId beepOnSoundId;
CFURLRef soundUrl = CFBundleCopyResourceURL(
CFBundleGetMainBundle(),
CFSTR("beep"),
CFSTR("wav"),
NULL
);
// soundUrl logged:
// file://localhost/var/mobile/Applications/ ... beep.wav
AudioServicesCreateSystemSoundID(soundUrl, &beepOnSoundId);
// beepOnSoundId logged: 4097
AudioServicesPlaySystemSound(beepOnSoundId);
Он перестает работать, когда я обновил свое устройство до iOS 5. Я ничего не слышу. Я выписал все переменные, и ни один из них не был равен нулю или 0.
Как изменился API в iOS 5, который разбивает мой звуковой код?
Update
Проблема может быть в том, что во время воспроизведения звука я выполняю AVCaptureSession
. iOS 5 как-то не позволяет вам делать это больше. Мне нужно воспроизвести звуковой сигнал, когда я записываю что-то с камеры.
Ответы
Ответ 1
Этот отчет об ошибке может быть связан с вашим вопросом, если у вас работает AVCaptureSession.
В iOS 5 при использовании вызова AudioServicesPlaySystemSound он будет не работает, когда есть активная AVCaptureSession с аудиоустройством активным.
Ответ 2
Одна из проблем может заключаться в том, что в ios 5 при вызове AudioServicesPlaySystemSound она перестает работать, если активна AVCaptureSession с активным аудиоустройством.
Также проверьте имена импорта в ваших файлах, убедитесь, что импорт audiotoolbox находится во всех ваших контроллерах view.
Я также пошел к гиду и получил это для вас:) Я оставлю имя сайта внизу
Шаг 1: Импорт системы AudioToolbox
Начните с импорта инфраструктуры Audio Toolbox в ваше приложение, чтобы сделать System Sound Services доступным для вашего кода. Для этого выберите проект "PhoneAppSkin" на панели "Навигатор проектов" в Xcode, затем выберите "PhoneAppSkin" в разделе "TARGETS" и, наконец, выберите вкладку "Построить фазы". После этого ваш экран должен выглядеть примерно так:
![enter image description here]()
Затем нажмите "Связывание с бинарными библиотеками" и нажмите "+", чтобы добавить новую структуру в наши проекты, связывающие фазу.
![enter image description here]()
Наконец, найдите всплывающее окно рамки "AudioToolbox" и нажмите "Добавить".
![enter image description here]()
Затем откройте файл PhoneViewController.h и добавьте строку, необходимую для фактического импорта рамки Audio Toolbox в ваш класс:
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
Теперь функции Audio Toolbox должны работать
Веб-сайт Я получил изображения от: http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_playing-systemsoundid/
Ответ 3
У меня почти такой же код, и он работает для меня в iOS5 с видео и сессиями аудио-мультимедиа. Если у вас есть весь код в функции для воспроизведения звука, проблема может заключаться в том, что объект SystemSoundID освобождается до того, как звук может быть воспроизведен, или проблема может быть связана с URL-адресом. Но я думаю, это первый.
Смотрите, работает следующий код:
Объявление SystemSoundID находится в заголовке объекта, и объект живет достаточно долго, чтобы воспроизводить звук.
SystemSoundID soundID;
AudioServicesCreateSystemSoundID находится в инициализации объекта.
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource: @"sound" ofType:@"wav"]], &soundID);
Затем вы можете использовать AudioServicesPlaySystemSound, где бы вы ни захотели внутри объекта.
AudioServicesPlaySystemSound(soundID);
Попробуйте поместить эти коды предметов в соответствующие места, и вы должны услышать звук.
Ответ 4
В моем конструкторе:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"video-sent"
ofType:@"caf"]];
self.sentSound = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
[self.sentSound prepareToPlay];
Функция playSentSound
- (void)playSentSound
{
DLog(@"PLay Sound %@", self.sentSound);
[self.sentSound play];
}
а затем в коде, который я просто называю
[self playSentSound];
Ключевыми здесь являются первые 4 строки...; -)