无法录制或播放简单的录音机?

时间:2012-06-10 15:22:33

标签: objective-c

我有 2 类,记录和播放器。在我的主场景中,我创建了一个实例并进行播放和录制。但是,正如我所见,它只记录并以某种方式不播放(文件不存在!)

以下是两者的代码:

-(void)record {
    NSArray *dirPaths;
    NSString *docsDir;
    NSString *sound= @"sound0.caf" ;
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ;
    docsDir = [dirPaths objectAtIndex:0];
    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:sound];
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
      [NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
      [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
      [NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
      [NSNumber numberWithInt: AVAudioQualityMax],
      AVEncoderAudioQualityKey, nil];

    NSError *error;
    myRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:settings error:&error];

    if (myRecorder)  {
        NSLog(@"rec");
        [myRecorder prepareToRecord];
        myRecorder.meteringEnabled = YES;
        [myRecorder record];
    } else
        NSLog( @"error"  );
}

我可以看到日志 rec

-(void)play {
  NSArray *dirPaths;
  NSString *docsDir;
  dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
    NSUserDomainMask, YES);
  docsDir = [dirPaths objectAtIndex:0];
  NSString *soundFilePath1 =  @"sound0.caf" ;
  NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath1];
  BOOL isMyFileThere = [[NSFileManager defaultManager] fileExistsAtPath:soundFilePath1];
  if(isMyFileThere) {
    NSLog(@"PLAY"); 
    avPlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:NULL];
    avPlayer1.volume = 8.0;
    avPlayer1.delegate = self;
    [avPlayer1 play];
 }
}

我没有看到日志 PLAY

我打电话给他们:

recInst=[recorder alloc]; //to rec
[recInst record];

plyInst=[player alloc]; //play
[plyInst play];

并停止录音机:

- (void)stopRecorder {
    NSLog(@"stopRecordings");
    [myRecorder stop];
    //[myRecorder release];    
}

这里有什么问题?感谢。

1 个答案:

答案 0 :(得分:1)

在记录方法中,您将文件名附加到路径:

NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound0.caf"];

你没有在你的play方法中这样做,所以它正在寻找当前工作目录中的文件,而不是Documents目录。

你需要这样做:

NSString *soundFilePath1 = [docsDir stringByAppendingPathComponent:@"sound0.caf"];

而不是:

NSString *soundFilePath1 =  @"sound0.caf" ;

另外一个注意事项:soundFilePath和soundFilePath1都是局部变量。因此,它们在各自的方法之外是不可见的。因此,没有必要给他们不同的名字。您可以将它们称为soundFilePath,并且不会发生冲突。