2012-06-01 2 views
11

я импортировал аудио инструментов и avfoundation в мой класс и добавил рамки для моего проекта, и я использую этот код для воспроизведения звука:AVAudioPlayer, No Sound

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

Zero звук. Любая помощь очень ценится, спасибо.

+1

'soundURL' действительно и' audioPlayer' не равен нулю? Можете попробовать передать объект «NSError» в инициализацию «AVAudioPlayer» и посмотреть, получаете ли вы ошибку. – gschandler

+0

Являетесь ли вы 'audioPlayer' non nil после' init'? Если не использовать аргумент ошибки, и вы можете получить полезную помощь ... –

+0

Я выполнил 'NSError * err;' и добавил '& err' в' audioPlayer' и распечатал его так: 'NSLog (@"% @ ", err);' и все, что я получаю, это '(null)'. –

ответ

25

Обновленный ответ:

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

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

В коде:

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


.m 
~ 
@implementation 
@synthesize _player = player; 
+0

Выполнено, ничего. –

+2

Что бы это добавило? Документы заявляют, что при вызове 'play ... этот метод неявно вызывает метод prepareToPlay, если аудиоплеер еще не подготовлен к игре.' –

+0

Это неправильно ... – SmallChess

9

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

+0

Что именно вы имеете в виду, сделав ссылку? –

+0

AVAudioPlayer * аудиоPlayer = ... в исходном коде. После окончания функции аудиоплеер будет освобожден. Вам нужно будет иметь сильную ссылку на экземпляр. – SmallChess

+0

Это тоже меня. Конечно, раздражающая ошибка/особенность/грань ARC. Я регистрировал, что у меня def был объект игрока, нет объекта ошибки, файл существовал по URL-адресу и регистрировался, что игрок все еще существовал после вызова '[play player]' и никакого звука. Я предполагаю, что фактическое воспроизведение происходит в другом потоке, и к тому времени, когда он запускается, ссылка на obj игрока равна nil, thx - ARC. – Brynjar

18

Да, ARC была для меня проблемой. Я решил просто добавить:

В .h

@property (strong, nonatomic) AVAudioPlayer *player; 

В ом

@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]; 
} 
+0

Спасибо, это также решило мою проблему. Меня озадачило то, что AVAudioPlayer все равно будет играть на протяжении всего аудиоклипа, хотя ARC выпустила данные. Даже странно, что на наушниках я слышал тихое шипение в это время. –

+0

Если вы не хотите объявлять сильное свойство для аудиоплеера, вы можете просто создать для него указатель 'static'. Это позволит сохранить его в памяти достаточно долго, чтобы закончить воспроизведение звука, даже после того, как его объявленная область выходит. –

1

Если объявить AVAudioPlayer в методе класса, как -viewDidLoad и ARC включена, игрок будет выпущен сразу после -viewDidLoad и станет nil, (-(BOOL)play метод не будет блокировать поток), это произойдет в миллисекундах, очевидно, что «nil» не может ничего воспроизвести, поэтому вы даже не услышите звук.

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

Смежные вопросы