为什么我的录音无法播放? (iPhone SDK)

时间:2010-02-18 21:38:26

标签: iphone sdk audio recording

我正在编写一个应用程序,让我可以记录门铃声并将其播放回用户按下按钮时看到的门铃。 我的应用程序似乎记录并保存文件(文件在那里(在Documents中)根据iPhone模拟器,因为我在app delegate中创建了目录))。 但播放不起作用。 (顺便说一句,录音属性返回TRUE。)

更新:这是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];
    }
}

2 个答案:

答案 0 :(得分:1)

唯一突然出现的是你正在调用[NSNumber numberWithInt:44100.0]而不是numberWithDouble。

答案 1 :(得分:1)

虽然这可能不是这个代码的问题,但在我的情况下,无法播放录制的音频文件是因为没有调用[audioRecorder stop]。我的音频播放器参考的代码是nil,当它到达应该调用停止的代码时,所以使用调试器确保当你告诉录音停止时你仍然有一个到录音机的链接。