Звук на симуляторе, но не на устройстве

Я использую следующее для воспроизведения файла m4a:

NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: fileName];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);

На симуляторе работает нормально, но на устройстве ничего не слышно. Все звуковые файлы, которые я использую, остаются в комплекте. Вот как выглядит filePath с устройства:

file://localhost/var/mobile/Applications/418945F3-3711-4B4D-BC65-0D78993C77FB/African%20Adventure.app/Switch%201.m4a

Есть ли проблема с путем к файлу или что-то еще, что мне нужно сделать для устройства?


person user230949    schedule 06.01.2010    source источник
comment
Убедитесь, что ваш телефон не в беззвучном режиме! Я потратил 2 часа, чтобы выяснить это ...   -  person Mathieu    schedule 13.11.2012


Ответы (5)


Кстати, у меня была точно такая же проблема, и я потратил около часа на преобразование файлов в правильный формат и т. Д. Но проблема заключалась в переключателе отключения звука на iPad. Таким образом, даже несмотря на то, что громкость была увеличена, и я мог слышать другие звуки на iPad, потому что был включен переключатель отключения звука, он не воспроизводил системные звуки.

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

person TheJerkMan24    schedule 03.12.2012

У меня тоже были проблемы с этим. В конце концов я понял, что это произошло потому, что AudioServices может воспроизводить звук только со следующими ограничениями.

Звуковые файлы, которые вы воспроизводите с помощью этой функции, должны быть: - Продолжительностью не более 30 секунд - В формате линейной PCM или IMA4 (IMA / ADPCM) - Упакованы в файл .caf, .aif или .wav

Из документации Apple: http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference.html

person pchap10k    schedule 16.11.2010

Возможно, вы захотите использовать AVAudioPlayer вместо AudioServices.

Следующий код берет аудиофайл (.m4a) и воспроизводит аудиофайл 1 раз. Не забудьте выпустить "audioPlayer", когда закончите с ним.

NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"m4a"];

NSURL *url = [NSURL fileURLWithPath:urlAddress];
NSError *error;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
audioPlayer.numberOfLoops = 0;

if (audioPlayer == nil)
{
  NSLog([error description]);
}
else
{
  [audioPlayer play];
}

Надеюсь, этот пример поможет вам с воспроизведением звука на реальном устройстве. Также может быть хорошей идеей увеличить звук устройства при воспроизведении файла.

Примечание. Вам нужно будет добавить в свой проект фреймворк AVFoundation, если вы еще этого не сделали. А также импортировать файл заголовка.

#import <AVFoundation/AVFoundation.h>

Обновление:

Из обзора Apple Core Audio. Документ

Службы аудиосеансов

Службы Audio Session Services позволяют управлять аудиосеансами в приложении, координируя поведение звука в приложении с фоновыми приложениями на iPhone или iPod touch. Службы аудиосеансов состоят из подмножества функций, типов данных и констант, объявленных в файле заголовка AudioServices.h в AudioToolbox.framework.

Класс AVAudioPlayer

Класс AVAudioPlayer предоставляет простой интерфейс Objective-C для воспроизведения звуков. Если вашему приложению не требуется стереопозиционирование или точная синхронизация, и если вы не воспроизводите звук, захваченный из сетевого потока, Apple рекомендует использовать этот класс для воспроизведения. Этот класс объявлен в заголовочном файле AVAudioPlayer.h в AVFoundation.framework.

person Tammen Bruccoleri    schedule 06.01.2010
comment
Спасибо. Я попробую. Почему AudioServices не может воспроизводить звуки? Или зачем использовать одно вместо другого? - person user230949; 06.01.2010
comment
Сейчас я использую AVAudioPlayer на основе пользовательского события (т.е. нажатие кнопки). Я отпускаю, если не nil, создаю экземпляр и играю. Кажется, есть небольшая задержка, так как я каждый раз создаю экземпляр. Есть более эффективный способ? - person user230949; 07.01.2010
comment
@ user230949: вы можете создать звуковой объект, похожий на эту оболочку для SystemSoundID, только вы создаете оболочку для AVAudioPlayer . - person JohnK; 07.08.2013

Начните с проверки ваших возвратов на ошибки. FilePath равен нулю? Возвращает ли какая-либо из функций AudioServices ошибку? Наиболее вероятная причина - чувствительность к регистру. Файловая система iPhone чувствительна к регистру, а Mac - нет. Но первый шаг в отладке - это посмотреть на ошибки, которые выдает система.

person Rob Napier    schedule 06.01.2010
comment
filePath не равен нулю. Он имеет значение, которое я опубликовал в OP. Я не вижу никаких ошибок. - person user230949; 06.01.2010
comment
Вы проверили результаты OSStatus, и оба не ошиблись? - person Rob Napier; 06.01.2010
comment
Как проверить результаты OSStatus? - person user230949; 06.01.2010
comment
AudioServicesCreateSystemSoundID () и AudioServicesPlaySystemSound () возвращают код результата типа OSStatus (все аудио функции делают). Если он возвращает 0 (noErr), значит, он был успешным. В противном случае это отрицательное число, указывающее на ошибку. Они задокументированы здесь: developer.apple. ru / iphone / library / documentation / AudioToolbox / - person Rob Napier; 06.01.2010
comment
Спасибо. AudioServicesCreateSystemSoundID возвращает 0, но AudioServicesPlaySystemSound является недействительным. - person user230949; 07.01.2010
comment
Попробуйте вытащить SysSound и посмотрите, работает ли он для вас. Если это так, поищите, чем отличается ваш код: developer.apple.com/ iphone / library / samplecode / SysSound - person Rob Napier; 07.01.2010
comment
Спасибо. Я запустил этот проект на устройстве со звуком. Я вставляю свой файл m4a, но он не воспроизводится. Кажется, AudioServices не любит файлы m4a. - person user230949; 07.01.2010

Симулятор использует для воспроизведения обычный QuickTime, поэтому легко получить медиаресурсы, которые работают в симуляторе, но не работают на устройстве из-за отсутствия / неподдерживаемых кодеков. Тест заключается в том, можете ли вы вообще воспроизвести файл на устройстве, например, через Safari или приложение iPod.

person James Turner    schedule 06.01.2010
comment
Звуки воспроизводятся на iPod iPhone. - person user230949; 06.01.2010
comment
iTunes перекодирует звук, чтобы его можно было воспроизвести на устройстве, попробуйте воспроизвести через Safari. - person Harley Watson; 06.01.2010