Я пытаюсь воспроизвести звуковой файл из программы для 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
Это либо из-за того, что я неправильно понимаю метод «описания», либо это усугубляет проблему.
Есть идеи, что происходит не так?





Я попробовал то же самое со своим приложением, которое отлично воспроизводит звуки. Звуки не воспроизводятся в симуляторе, и когда я пытаюсь указать URL-адрес NSLog, я получаю тот же мусор, что и Вы и EXC_BAD_ACCESS на его вершине. Когда я регистрирую URL-адрес на устройстве, с URL-адресом все в порядке, но я все равно получаю EXC_BAD_ACCESS. Когда вываливаю логи, звучит игра и все работает. Если бы кто-нибудь мог объяснить такое поведение, я был бы признателен. Что касается Вашей проблемы, я бы бросил ведение журнала и попробовал код на устройстве.
Первый параметр NSLog - это строка формата; вы передаете [URL description] в качестве строки формата для второго использования NSLog. Это плохо, потому что, если описание URL-адреса содержит какие-либо символы %, тогда он будет печатать случайный материал из стека.
Вместо этого напишите
NSLog(@"%@", URL);
Здесь вам даже не нужно использовать -description; NSLog вызовет его автоматически, потому что %@ означает «объект», а не «NSString», и он достаточно умен, чтобы делать правильные вещи для вас.
Спасибо за это. Я должен признать, что я пытаюсь изучить это так же, как многие люди изучают JavaScript - то есть искать примеры и копировать / вставлять!
Обновленная информация по этому поводу.
У меня есть ключи, позволяющие запускать приложение на устройстве.
Я обнаружил, что мой файл .caf успешно воспроизводится, когда приложение запускается на устройстве.
Затем я попробовал разные альтернативы.
Файл .wav длительностью 60 секунд не работал на симуляторе и на устройстве.
Файл .wav длительностью 5 секунд будет работать на симуляторе, но не на устройстве.
Файл .aiff длительностью 5 секунд работает на симуляторе и на устройстве.
Было бы хорошо знать окончательно, что симулятор и устройство проверяют в файле, когда он передается в AudioServicesCreateSystemSoundID.
Вдобавок похоже, что симулятор iPhone не любит воспроизводить (systemSound) звуки длительностью более 5 секунд. У меня была та же проблема, что и наши приложения почти всегда проигрывают звуковой сигнал при запуске.
Одно из приложений, над которым я работал на симуляторе, не воспроизводило звук, но устройство воспроизводило. Позже я обнаружил, что у симулятора есть некоторые странные ограничения и то, как он обрабатывает звуки. Я зарегистрировал ошибку в Apple. Надеюсь, это будет решено с выпуском iPhone SDK 3.0.
Используйте класс "AVAudioPlayer" для воспроизведения файлов .caf.
спасибо за комментарии. Приятно слышать, что проблема есть у кого-то другого. У меня пока нет ключей для проверки на реальном устройстве.