我搜索过,我相信我的问题非常独特。我知道使用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格式。
答案 0 :(得分:20)
<强>解决。强>
1.-检查您的文件是否已添加到Build Phases中的“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
我假设BellController
是UIViewController
,如果它是一种不同类,只需相应地修改代码。
答案 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)
看看会发生什么。
另一种方法是在viewDidLoad
或initWithNib
中设置播放器对象,并将其作为属性存储在对象上。这样你可以使用类似的东西
[self.theAudio prepareToPlay];
每次按下按钮时,为避免加载音频,如果是高质量的音频,可以节省一些时间。然后,只需在[self.theAudio play];
方法中调用IBAction
。
很抱歉,如果这个答案有点草率 - 在iPad上打字就不能正确地检查。
答案 5 :(得分:1)
你应该给它一些时间准备发音,因为它可能是从URL缓冲。
代码:
[theAudio prepareToPlay];
[self performSelector:@selector(playMusic) withObject:nil afterDelay:3.0];