Попытка воспроизвести звук через iPhone Simulator

Я пытаюсь воспроизвести звуковой файл из программы для iPhone.

Вот код:

NSString *path = [[NSBundle mainBundle] pathForResource:@"play" ofType:@"caf"];
NSFileHandle *bodyf = [NSFileHandle fileHandleForReadingAtPath:path];
NSData *body = [bodyf availableData];
NSLog( @"length of play.caf %d",[body length] );
NSURL *url = [NSURL fileURLWithPath:path isDirectory:NO];
NSLog( [url description] );
NSLog( @"%d", AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID) );

Первый NSLog должен проверить, что у меня есть доступ к файлу (я сделал), второй NSLog должен показать URL-адрес файла, а третий NSLog возвращает -1500 «Произошла неопределенная ошибка».

Для второго NSLog я получаю следующий вывод:

file: // localhost / Users / alan / Library / Application 敲 慬 楴 敶 瑓 楲 upport / iPhone 蒠 ꁻ ތ Ā 獕 牥 ⽳ 污 湡 䰯 扩 慲 祲 楬 慣 楴 湯 匠 灵 桐 湯 ⁥ 楓 畭慬 潴 ⽲ 獕 牥 䄯 灰 楬 慣 ⽳ 䙂 㕅 㡂 㤱 䌭 䐳 ⴸ 䐴 ㍃ⴷ 䍁 ㈶ 㠵 䙁 㤴 ㈰ 䰯 捯 瑡 䵥 灡 ⽰ imulator / User / Applications / BFE5B819-C3D 4DCF-8C37-AC6258AF4902 / LocateMe.app / play.caf

Это либо из-за того, что я неправильно понимаю метод «описания», либо это усугубляет проблему.

Есть идеи, что происходит не так?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
8 120
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я попробовал то же самое со своим приложением, которое отлично воспроизводит звуки. Звуки не воспроизводятся в симуляторе, и когда я пытаюсь указать URL-адрес NSLog, я получаю тот же мусор, что и Вы и EXC_BAD_ACCESS на его вершине. Когда я регистрирую URL-адрес на устройстве, с URL-адресом все в порядке, но я все равно получаю EXC_BAD_ACCESS. Когда вываливаю логи, звучит игра и все работает. Если бы кто-нибудь мог объяснить такое поведение, я был бы признателен. Что касается Вашей проблемы, я бы бросил ведение журнала и попробовал код на устройстве.

спасибо за комментарии. Приятно слышать, что проблема есть у кого-то другого. У меня пока нет ключей для проверки на реальном устройстве.

Alan 03.11.2008 22:16

Первый параметр NSLog - это строка формата; вы передаете [URL description] в качестве строки формата для второго использования NSLog. Это плохо, потому что, если описание URL-адреса содержит какие-либо символы %, тогда он будет печатать случайный материал из стека.

Вместо этого напишите

NSLog(@"%@", URL);

Здесь вам даже не нужно использовать -description; NSLog вызовет его автоматически, потому что %@ означает «объект», а не «NSString», и он достаточно умен, чтобы делать правильные вещи для вас.

Спасибо за это. Я должен признать, что я пытаюсь изучить это так же, как многие люди изучают JavaScript - то есть искать примеры и копировать / вставлять!

Alan 03.11.2008 22:52
Ответ принят как подходящий

Обновленная информация по этому поводу.

У меня есть ключи, позволяющие запускать приложение на устройстве.

Я обнаружил, что мой файл .caf успешно воспроизводится, когда приложение запускается на устройстве.

Затем я попробовал разные альтернативы.

Файл .wav длительностью 60 секунд не работал на симуляторе и на устройстве.

Файл .wav длительностью 5 секунд будет работать на симуляторе, но не на устройстве.

Файл .aiff длительностью 5 секунд работает на симуляторе и на устройстве.

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

Вдобавок похоже, что симулятор iPhone не любит воспроизводить (systemSound) звуки длительностью более 5 секунд. У меня была та же проблема, что и наши приложения почти всегда проигрывают звуковой сигнал при запуске.

Одно из приложений, над которым я работал на симуляторе, не воспроизводило звук, но устройство воспроизводило. Позже я обнаружил, что у симулятора есть некоторые странные ограничения и то, как он обрабатывает звуки. Я зарегистрировал ошибку в Apple. Надеюсь, это будет решено с выпуском iPhone SDK 3.0.

Используйте класс "AVAudioPlayer" для воспроизведения файлов .caf.

Другие вопросы по теме