声音没有播放AVAudioPlayer

时间:2012-04-01 09:10:21

标签: iphone ios audio avaudioplayer core-audio

我搜索过,我相信我的问题非常独特。我知道使用AVAudioPlayer时的模拟器5.1错误,这不是我的问题。我在iOS 5.1设备上运行。

这是我的头文件:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

-(IBAction)pushBell;

@end

和我的实施文件:

#import "BellViewController.h"

@interface BellViewController ()

@end

@implementation BellViewController

-(IBAction)pushBell {

    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"bell1" ofType:@"caf"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
    NSError *error;

    AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
    [theAudio setDelegate:self];
    [theAudio setNumberOfLoops:0];
    [theAudio play];

}

@end

我的.xib中有一个播放该文件的按钮。

为了确保我正确引用了我的音频文件,我故意输入了错误的文件名,实际上我得到了一个例外。为确保文件可播放,我将其邮寄给自己并在设备上播放。

当我点按按钮时,我什么都没听到。没有错误。我不知道出了什么问题。

更多信息 带有iOS 5.1的iPhone 4 Xcode 4.3.2 使用来自大型.wav文件的afconvert,音频大约700kbps转换为.caf格式。

6 个答案:

答案 0 :(得分:20)

<强>解决。

1.-检查您的文件是否已添加到Build Phases中的“Copy Bundle Resources”。 Copy Bundle Resources

2.- ViewController.m

#import <AVFoundation/AVAudioPlayer.h>

@interface ViewController ()
@property (nonatomic, strong) AVAudioPlayer *theAudio;
- (IBAction)pushBell;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"beep-beep" ofType:@"caf"];
    NSURL *soundURL = [NSURL fileURLWithPath:soundPath];

    NSError *error = nil;
    self.theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
}

- (IBAction)pushBell {
    [self.theAudio play];
}

3.-将IBAction连接到Interface Builder中的按钮。

完成。

答案 1 :(得分:19)

这是我的问题,所以我只是将它发布在这里以防万一!#/ p>

信不信由你,似乎有一个错误(至少在iPad 2上的iOS 5.1中),如果你将侧面开关设置为静音并且它是静音的,那么将侧开关设置为锁定旋转,AVAudioPlayer发出声音除了通过耳机,不会播放!

因此,我必须转到“设置”应用,将开关更改为“静音”,然后取消iPad静音,将其切换回“锁定旋转”,我的应用就开始正常运行。

答案 2 :(得分:14)

你的theAudio AVAudioPlayer在它甚至可以开始播放之前被解除分配(因为它被分配为pushBell方法中的局部变量。

将您的代码更改为:

头文件:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface BellViewController:UIViewController

@property (nonatomic, strong) AVAudioPlayer *theAudio;

-(IBAction)pushBell;

@end

实施档案:

#import "BellViewController.h"

@implementation BellViewController

@synthesize theAudio = _theAudio;

- (void)viewDidLoad {

    if (!theAudio) {

        NSString *soundPath =[[NSBundle mainBundle] pathForResource:@"bell1" ofType:@"caf"];
        NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
        NSError *error;

        _theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
        [self.theAudio setDelegate:self];
        [self.theAudio setNumberOfLoops:0];

        [self.theAudio prepareToPlay];
    }
}

-(IBAction)pushBell {

   [self.theAudio play];
}

@end

我假设BellControllerUIViewController,如果它是一种不同类,只需相应地修改代码。

答案 3 :(得分:4)

我认为这是一个内存问题,您应该将AVAudioPlayer *theAudio实例化为全局类对象,并在init方法中初始化它。然后,只需在[theAudio play];方法中运行-(IBAction)pushBell方法。

我做了一个与播放系统声音有关的类似问题(实际上就是你要做的事情),检查一下我的回答是在底部:

Couldn't play system sound after switching to iOS 5

顺便说一下,考虑将铃声作为系统声音播放,AVAudioPlayer更适合播放音轨,而不是铃声和效果。

我希望它有所帮助。

答案 4 :(得分:2)

我同意hooleyhoop。尝试

NSLog(@"%@", error.userInfo) 

看看会发生什么。

另一种方法是在viewDidLoadinitWithNib中设置播放器对象,并将其作为属性存储在对象上。这样你可以使用类似的东西      [self.theAudio prepareToPlay];

每次按下按钮时,为避免加载音频,如果是高质量的音频,可以节省一些时间。然后,只需在[self.theAudio play];方法中调用IBAction

很抱歉,如果这个答案有点草率 - 在iPad上打字就不能正确地检查。

答案 5 :(得分:1)

你应该给它一些时间准备发音,因为它可能是从URL缓冲。

代码:

[theAudio prepareToPlay];

[self performSelector:@selector(playMusic) withObject:nil afterDelay:3.0];