为什么我的录音不能播放? (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]; 
    } 
} 
+0

这完全让我想起了那门铃SNL skit。 – 2010-02-18 21:48:29

+0

shanooz ....大声笑 – 2010-11-20 04:57:19

,在跳出我的唯一的事情是,你调用[NSNumber的numberWithInt:44100.0]代替numberWithDouble。

虽然这段代码可能不是问题,但在我的情况下,无法播放录制的音频文件是因为未调用[audioRecorder stop]。当我的音频播放器参考代码到达应该调用stop的代码时,我已经安装了代码,因此请使用调试器确保何时告诉录制停止,您仍然可以连接到录音机。