12

我已将音频工具箱和 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"];

但是我得到零声音。

4

4 回答 4

27

更新的答案:

我有这个问题。它与 ARC 相关,与 prepareForPlay 无关。只需对它进行强有力的引用,它就会起作用。

如下用户所述:Kinderchocolate:)

在代码中:

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


.m
~
@implementation
@synthesize _player = player;
于 2012-06-01T20:27:13.700 回答
18

是的,ARC 也是我的问题。我解决了只是添加:

在.h

@property (strong, nonatomic) AVAudioPlayer *player;

在.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];
}
于 2012-12-04T14:58:58.597 回答
9

我有这个问题。它与 ARC 相关,与 prepareForPlay 无关。只需对它进行强有力的引用,它就会起作用。

于 2012-08-03T06:31:01.593 回答
1

如果你在像-viewDidLoad这样的类方法中声明你的AVAudioPlayer,并且ARC是开启的,那么播放器将在-viewDidLoad之后立即被释放并变为nil,(-(BOOL)play方法不会阻塞线程)这将在毫秒内发生,明显的“nil”不能播放任何东西,所以你甚至听不到声音。

最好将播放器声明为 ViewController@property或将其设置为全局单例,任何东西都可以持续更长时间。

于 2012-12-23T17:00:09.147 回答