为什么我的录音不能播放? (iPhone SDK)
问题描述:
我正在编程一款应用程序,可以让我录制门铃声音,并在用户按下按钮时看到的门铃上播放。 我的应用程序似乎记录并保存文件(根据iPhone模拟器,文件在那里(在文档中),因为我在应用程序委托中创建了目录))。 但是播放不起作用。 (顺便说一下,录制属性返回TRUE。)为什么我的录音不能播放? (iPhone SDK)
UPDATE:这里是the zip of the whole project。
有人能帮我看看有什么问题吗?
- (void)viewDidLoad {
[super viewDidLoad];
self.view.layer.cornerRadius = 8;
[actionButton setBackgroundImage:[[UIImage imageNamed:@"biggreenbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
NSFileManager *nsf = [NSFileManager defaultManager];
NSArray *allDocs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [allDocs objectAtIndex:0];
NSString *savedDBells = [path stringByAppendingPathComponent:@"Custom Doorbells"];
NSString *nextFile;
for (NSInteger i = 1; i < 100; i++){
if (![nsf fileExistsAtPath:[savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]]]){
nextFile = [savedDBells stringByAppendingPathComponent:[NSString stringWithFormat:@"d%i%@",i,@".caf"]];
break;
}
}
NSURL *url = [[NSURL alloc] initFileURLWithPath:nextFile];
NSDictionary *setup = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatMPEG4AAC],AVFormatIDKey,
[NSNumber numberWithInt:44100.0],AVSampleRateKey,
[NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
NSError *err;
NSLog(@"%@",url);
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:setup error:&err];
[setup release];
[url release];
//Gradient code
/*
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];
[self.view.layer insertSublayer:gradient atIndex:0];
*/
}
-(IBAction) actionButtonPressed: (id) sender{
NSLog(@"%@",actionButton.titleLabel.text);
if ([actionButton.titleLabel.text isEqual:@"Finish Recording"]){
BOOL test = recorder.recording;
NSLog(@"Recording property = %i",test);
[upCounter invalidate];
[recorder stop];
[self dismissModalViewControllerAnimated:YES];
}
if ([actionButton.titleLabel.text isEqual:@"Begin Recording"]){
upCounter = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:upCounter forMode:NSDefaultRunLoopMode];
[actionButton setTitle:@"Finish Recording" forState:UIControlStateNormal];
[actionButton setBackgroundImage:[[UIImage imageNamed:@"bigredbutton.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
NSLog(@"Recorder record = %i",[recorder record]);
}
}
在另一个视图控制器:
-(IBAction) recordingButtonPressed:(id) sender{
AVAudioSession *avs = [AVAudioSession sharedInstance];
//Test for written folder
/*NSFileManager *fileMan = [NSFileManager defaultManager];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
*/
if (avs.inputIsAvailable){
NSString *recordedFile;
RecordingViewController *recorderVC = [[RecordingViewController alloc] initWithNibName:@"RecordingViewController" bundle:nil];
recorderVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:recorderVC animated:YES];
recordedFile = [recorderVC.recorder.url absoluteString];
[recorderVC release];
self.currentSoundPath = recordedFile;
NSLog(@"%@",currentSoundPath);
/*if ([fileMan fileExistsAtPath:recordedFile]){
UIActionSheet *overwrite = [[UIActionSheet alloc] initWithTitle:@"Overwrite the current doorbell recording?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Overwrite" otherButtonTitles:nil];
overwrite.delegate = self;
[overwrite showInView:self.view];
[overwrite release];
}*/
/*NSDictionary *recorderSettingsDict=[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:kAudioFormatAppleIMA4],AVFormatIDKey,
[NSNumber numberWithInt:44100.0],AVSampleRateKey,
[NSNumber numberWithInt: 2],AVNumberOfChannelsKey,
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
nil];
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recordedFile settings:<#(NSDictionary *)settings#> error:<#(NSError **)outError#>];*/
}
else{
UIAlertView *noAudio = [[UIAlertView alloc] initWithTitle:@"No microphone connected" message:@"Please connect a microphone to record a doorbell." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[noAudio show];
[noAudio release];
}
}
答
,在跳出我的唯一的事情是,你调用[NSNumber的numberWithInt:44100.0]代替numberWithDouble。
答
虽然这段代码可能不是问题,但在我的情况下,无法播放录制的音频文件是因为未调用[audioRecorder stop]
。当我的音频播放器参考代码到达应该调用stop的代码时,我已经安装了代码,因此请使用调试器确保何时告诉录制停止,您仍然可以连接到录音机。
这完全让我想起了那门铃SNL skit。 – 2010-02-18 21:48:29
shanooz ....大声笑 – 2010-11-20 04:57:19