Воспроизведение MP3 с использованием AVAudioPlayer не работает на устройстве - PullRequest
19 голосов
/ 09 января 2011

Я тестирую свое приложение на своем 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).

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

Есть идеи, что случилось ?!

Ответы [ 4 ]

49 голосов
/ 07 апреля 2011

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

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

Внезапно перестал работать звук - как симулятор в последней версии 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];

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

#import <AVFoundation/AVAudioSession.h>

Надеюсь, теперь звук будет воспроизводиться на устройстве.

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

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

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

26 голосов
/ 21 ноября 2012

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

Мне потребовалось полчаса и немного гуглил в этот момент А-ха.

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

17 голосов
/ 25 августа 2011

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

- (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];
}

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

1 голос
/ 09 января 2011

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

...