我正在尝试在我的应用中播放一个简短的音频文件(mp3)。这是我正在使用的代码:
AVAudioPlayer *AudioPlayer;
NSError *error;
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
pathForResource:@"filename"
ofType:@"mp3"]];
AudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
AudioPlayer.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
if (error)
{
NSLog(@"Error: %@",
[error localizedDescription]);
}
else
{
[AudioPlayer play];
}
我真的不知道自己错过了什么,我所遵循的例子似乎与我正在做的事情相符。
编辑:我还应该提一下代码运行没有错误,有一个尝试捕获这个。
答案 0 :(得分:3)
由于ARC,我遇到了类似的问题。不是在使用它的同一方法中定义AVAudioPlayer,而应该在其他地方有一个实例变量,例如UIViewController。这样ARC就不会自动释放这个对象,音频可以播放。
答案 1 :(得分:1)
我做了一些补充并且让它发挥作用:
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface FirstViewController : UIViewController <AVAudioPlayerDelegate> {
AVAudioPlayer *data;
UIButton *playButton_;
}
@property(nonatomic, retain) IBOutlet UIButton *playButton;
-(IBAction)musicPlayButtonClicked:(id)sender;
@end
#import "ViewController.h"
@implementation FirstViewController
@synthesize playButton=playButton_;
- (IBAction)musicPlayButtonClicked:(id)sender {
NSString *name = [[NSString alloc] initWithFormat:@"09 No Money"];
NSString *source = [[NSBundle mainBundle] pathForResource:name ofType:@"mp3"];
if (data) {
[data stop];
data = nil;
}
data=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: source] error:NULL];
data.delegate = self;
[data play];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
在Interface Builder中,我添加了一个按钮,并将其与IBOutlet
和musicPlayButtonClicked
IBAction
相关联。
不要忘记将AVFoundation
框架添加到您的项目中。
PS 我真的很抱歉我的英语,请放纵。
答案 2 :(得分:0)
我自己遇到了这个问题,直到我发现声音没有通过扬声器传来(相反 - 它被重定向到呼叫扬声器)。尝试添加此项以通过扬声器重定向声音:
UInt32 doChangeDefaultRoute = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
sizeof (doChangeDefaultRoute),
&doChangeDefaultRoute);