Подтвердить что ты не робот

Воспроизведение MP3 с использованием AVAudioPlayer, не работающего на устройстве

Я тестирую свое приложение на своем iPhone 3GS с iOS 4.2

Я использую следующий код, который воспроизводит звук в моем IBAction. Он отлично работает в симуляторе (iPad и iPhone) - я слышу звук.

NSString *pathToMusicFile1 = [[NSBundle mainBundle] pathForResource:@"alarm" ofType:@"mp3"];
NSError *error;
alarmSound = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:pathToMusicFile1] error:&error]; 
NSLog(@"Song1 Loaded");
if (alarmSound == nil) {
    NSLog(@"Error playing sound");
} else {
    alarmSound.numberOfLoops = 20;
    alarmSound.volume = 1.0;
    [alarmSound play];
}

У меня все правильно сказано (заголовки и фреймворки и т.д.), так как я могу слышать звук в симуляторе.

Я также проверил, что мой телефон НЕ в тихом режиме! Я слышу другие звуки из общего графического интерфейса iphone. (пример от datepicker).

Я также очистил все цели и удалил приложение для переустановки.

Любые идеи, что неправильно?!

4b9b3361

Ответ 1

Итак, у меня тоже была эта проблема - ну, я уверен, что она такая же...

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

Вдруг звук перестает работать - и симулятор в последней версии sdk (версия 4.0), и на устройстве тоже (снова работает iOS 4).

Код, который всегда работал для нас, был...

NSString *sound_file;
if ((sound_file = [[NSBundle mainBundle] pathForResource:@"track1" ofType:@"mp3"])){

NSURL *url = [[NSURL alloc] initFileURLWithPath:sound_file];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
audioPlayer.delegate = self;
[url release];

[audioPlayer prepareToPlay];
[audioPlayer play];

}

Наконец, я узнал, что теперь вам нужно установить тип воспроизведения AVAudioSession, чтобы звук воспроизводился через динамик, как он уже делал! Поместите следующую строку кода в свой делегат приложения applicationDidFinishLaunching обработчик событий...

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

Не забудьте добавить include в файл делегирования .h файла приложения (очевидно, вам нужно также импортировать структуру AVFoundation, если это еще не сделано)...

#import <AVFoundation/AVAudioSession.h>

Надеюсь, теперь это сделает ваш звук на устройстве.

Не пытайтесь понять, что, по моему мнению, может быть отдельной проблемой, и что звук все еще не воспроизводится в симуляторе. Я видел другие сообщения, предлагающие это, но я не уверен, насколько это широко распространено. Я узнал, что если бы я выбрал iPad 3.2 в качестве своего симулятора, он по крайней мере работал над этим. Радость!

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

Anywayz, надеюсь, это поможет кому-то еще.

Ответ 2

чрезвычайно важно иметь переменную audioPlayer как свойство. В противном случае с ARC он будет выпущен до того, как у него появится шанс сыграть!

Мне понадобилось полчаса, и некоторые из них зашли в этот момент A-ha.

Теперь мой звук отлично работает!

Ответ 3

Моя проблема заключалась в том, что iOS автореализовывал мой экземпляр AVAudioPlayer, прежде чем файл получил возможность играть. Странно это произошло только с MP3, а не с AU файлами. Решение заключалось в том, чтобы не устанавливать его как автоопределение, а затем отпустить его в методе делегатов...

- (void)playSound:(NSString *)sound
{
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:sound ofType:@""]] error:NULL];
    audioPlayer.delegate = self;
    [audioPlayer play];
}

... затем в методе делегата...

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [player release];
}

... отлично работает сейчас.

Ответ 4

Вы пробовали [NSURL URLWithString:pathToMusicFile1]; вместо fileURLWithPath:?