0

我有两个班级,一个记录和一个播放器。在我的主要场景中,我创建了它们的一个实例并播放和录制。但是,正如我所见,它只记录并且不播放(文件不存在!)

这是两者的代码:

-(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];    
}

这里有什么问题?谢谢。

4

1 回答 1

1

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

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

您不会在 play 方法中执行此操作,因此它会在当前工作目录的任何位置而不是 Documents 目录中查找文件。

你需要做:

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

代替:

NSString *soundFilePath1 =  @"sound0.caf" ;

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

于 2012-06-10T16:36:56.430 回答