我有 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];
}
这里有什么问题?感谢。
答案 0 :(得分:1)
在记录方法中,您将文件名附加到路径:
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound0.caf"];
你没有在你的play方法中这样做,所以它正在寻找当前工作目录中的文件,而不是Documents目录。
你需要这样做:
NSString *soundFilePath1 = [docsDir stringByAppendingPathComponent:@"sound0.caf"];
而不是:
NSString *soundFilePath1 = @"sound0.caf" ;
另外一个注意事项:soundFilePath和soundFilePath1都是局部变量。因此,它们在各自的方法之外是不可见的。因此,没有必要给他们不同的名字。您可以将它们称为soundFilePath,并且不会发生冲突。