Вопрос по objective-c, audio, iphone – AVAudioPlayer, нет звука

11

Я импортировал аудио-инструментарий и 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"];

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

soundURL действует иaudioPlayer не ноль? Можно попробовать передатьNSError объект в инициализацииAVAudioPlayer и посмотрим, получишь ли ты ошибку. gschandler
Я сделалNSError *err; и добавил&err наaudioPlayer и печатать так:NSLog(@"%@", err); и все, что я получаю, это(null). Josh Kahane
Ты используешь ARC? Я предполагаю, что это возможно, поскольку ни у кого нет сильной ссылки, ARC мог бы потенциально освободить ее во время загрузки буфера и воспроизведения сэмпла? Paul.s
Это твойaudioPlayer не ноль? Paul.s
Это тыaudioPlayer не ноль после тебяinit? Если не использовать аргумент ошибки, вы можете получить полезную помощь ... Paul.s

Ваш Ответ

4   ответа
25

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

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

В коде:

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


.m
~
@implementation
@synthesize _player = player;
Сделай это, ничего. Josh Kahane
Это не правильно.. SmallChess
на самом деле, неправильно. ARC является проблемой, как показано ниже. Brynjar
да, у меня та же проблема, после отключения дуги для конкретного файла и получения звука KETAN
Что бы это добавило? Документы утверждают, что при вызовеplay ... this method implicitly calls the prepareToPlay method if the audio player is not already prepared to play. Paul.s
18

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];
}
Спасибо, это также решило мою проблему. Что меня смутило, так это то, что AVAudioPlayer все равно будет проигрываться в течение всего аудиоклипа, даже если ARC выпустила данные. Даже странно, что в наушниках я слышал тихое шипение в течение этого времени. Simo A.
Если вы не хотите объявлять сильное свойство для аудиоплеера, вы можете просто создатьstatic указатель на это. Это сохранит его в памяти достаточно долго, чтобы закончить воспроизведение звука, даже после того, как объявленная область будет закрыта. Eric Baker
9

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

Что именно ты имеешь в виду, делая сильную ссылку? Val Kalinic
AVAudioPlayer * audioPlayer = ... в исходном коде. После завершения функции audioPlayer освобождается. Вам нужно иметь сильную ссылку на экземпляр. SmallChess
Это меня тоже достало. Конечно, раздражающая ошибка / особенность / аспект ARC. Я регистрировал, что у меня def был объект player, без объекта error, файл существовал по URL, и регистрировал, что плеер все еще существовал после вызова[player play] и нет звука. Я предполагаю, что фактическое воспроизведение происходит в другом потоке, и к тому времени, когда он вступит в силу, ссылка на объект игрока равна нулю, спасибо ARC. Brynjar
Да, ты прав. Он играет в другой теме. SmallChess
1

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

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

Похожие вопросы