AVAudioPlayer, нет звука

Я импортировал аудио-инструментарий и avfoundation в свой класс и добавил фреймворки в свой проект и использую этот код для воспроизведения звука:

- (void)playSound:(NSString *)name withExtension:(NSString *)extension
{
    NSURL* soundUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:name ofType:extension]]; 
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
    audioPlayer.delegate = self;
    audioPlayer.volume = 1.0;
    [audioPlayer play];
}

Я называю это так:

[self playSound:@"wrong" withExtension:@"wav"];

Нулевой звук. Любая помощь высоко ценится, спасибо.

 Paul.s01 июн. 2012 г., 22:03
Это твойaudioPlayer не ноль?
 Paul.s01 июн. 2012 г., 21:43
Это тыaudioPlayer не ноль после тебяinit? Если не использовать аргумент ошибки, вы можете получить полезную помощь ...
 Paul.s02 июн. 2012 г., 01:32
Ты используешь ARC? Я предполагаю, что это возможно, поскольку ни у кого нет сильной ссылки, ARC мог бы потенциально освободить ее во время загрузки буфера и воспроизведения сэмпла?
 Josh Kahane01 июн. 2012 г., 21:53
Я сделалNSError *err; и добавил&err наaudioPlayer и печатать так:NSLog(@"%@", err); и все, что я получаю, это(null).
 gschandler01 июн. 2012 г., 21:42
soundURL действует иaudioPlayer не ноль? Можно попробовать передатьNSError объект в инициализацииAVAudioPlayer и посмотрим, получишь ли ты ошибку.

Ответы на вопрос(4)

In .h

@property (strong, nonatomic) AVAudioPlayer *player;

In .m

@synthesize player;

-(void)startMusic{
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Riddls" ofType:@"m4a"];
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    player.numberOfLoops = -1; //infinite
    [player play];
}
 Simo A.18 нояб. 2013 г., 08:11
Спасибо, это также решило мою проблему. Что меня смутило, так это то, что AVAudioPlayer все равно будет проигрываться в течение всего аудиоклипа, даже если ARC выпустила данные. Даже странно, что в наушниках я слышал тихое шипение в течение этого времени.
 Eric Baker22 июл. 2015 г., 18:04
Если вы не хотите объявлять сильное свойство для аудиоплеера, вы можете просто создатьstatic указатель на это. Это сохранит его в памяти достаточно долго, чтобы закончить воспроизведение звука, даже после того, как объявленная область будет закрыта.
Решение Вопроса

У меня проблема. Это с ARC и не имеет ничего общего с prepareForPlay. Просто сделайте сильную ссылку к нему и оно будет работать.

как указано ниже пользователем:Kinderchocolate:)

В коде:

.h
~
@property (nonatomic, strong) AVAudioPlayer *player;


.m
~
@implementation
@synthesize _player = player;
 Josh Kahane01 июн. 2012 г., 22:37
Сделай это, ничего.
 SmallChess03 авг. 2012 г., 08:31
Это не правильно..
 Brynjar08 окт. 2012 г., 16:24
на самом деле, неправильно. ARC является проблемой, как показано ниже.
 KETAN25 окт. 2012 г., 09:26
да, у меня та же проблема, после отключения дуги для конкретного файла и получения звука
 Paul.s02 июн. 2012 г., 01:33
Что бы это добавило? Документы утверждают, что при вызовеplay ... this method implicitly calls the prepareToPlay method if the audio player is not already prepared to play.

например -viewDidLoad, и ARC включен, проигрыватель будет освобожден сразу после -viewDidLoad и станет нулевым, -(BOOL)play method не блокирует поток) это произойдет за миллисекунды, очевидно, что "nil" ничего не может воспроизвести, поэтому вы даже не услышите звук.

Лучше объявить игрока как ViewController's@property или сделай его глобальным синглтоном, все может длиться дольше.

Просто сделайте сильную ссылку на него, и он будет работать.

 Brynjar08 окт. 2012 г., 16:30
Это меня тоже достало. Конечно, раздражающая ошибка / особенность / аспект ARC. Я регистрировал, что у меня def был объект player, без объекта error, файл существовал по URL, и регистрировал, что плеер все еще существовал после вызова[player play] и нет звука. Я предполагаю, что фактическое воспроизведение происходит в другом потоке, и к тому времени, когда он вступит в силу, ссылка на объект игрока равна нулю, спасибо ARC.
 Val Kalinic01 сент. 2012 г., 18:30
Что именно ты имеешь в виду, делая сильную ссылку?
 SmallChess02 сент. 2012 г., 16:46
AVAudioPlayer * audioPlayer = ... в исходном коде. После завершения функции audioPlayer освобождается. Вам нужно иметь сильную ссылку на экземпляр.
 SmallChess09 окт. 2012 г., 04:27
Да, ты прав. Он играет в другой теме.

Ваш ответ на вопрос