我正在处理的程序要求我保存大量的AVAudioRecorder文件以备将来使用。然而,虽然我知道如何保存和记录静态数量的文件,但我希望能够动态保存它们,而不必每次进行录制时都使用相同的声音文件URL(如“sound.caf”) ,以及能够随时播放这些文件。有人知道我会这样做吗?
下面的代码显示了我当前的录制代码:
- (IBAction)playSound:(id)sender {
if (!self.audioRecorder.recording)
{
NSError *error;
if (self.audioPlayer)
self.audioPlayer = nil;
self.dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
self.docsDir = [self.dirPaths objectAtIndex:0];
self.soundFilePath = [self.docsDir
stringByAppendingPathComponent:@"sound.caf"];
self.soundFileURL = [NSURL fileURLWithPath:self.soundFilePath];
self.audioPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:self.soundFileURL
error:&error];
self.audioPlayer.delegate = self;
[self.audioPlayer prepareToPlay];
if (error)
NSLog(@"Error: %@",
[error localizedDescription]);
else
[self.audioPlayer play];
}
}
- (IBAction)recordSound:(id)sender {
if(!self.audioRecorder.recording)
{
self.dirPaths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
self.docsDir = [self.dirPaths objectAtIndex:0];
self.soundFilePath = [self.docsDir
stringByAppendingPathComponent:@"sound.caf"];
self.soundFileURL = [NSURL fileURLWithPath:self.soundFilePath];
self.recordSettings = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:AVAudioQualityMin],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16],
AVEncoderBitRateKey,
[NSNumber numberWithInt: 2],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44100.0],
AVSampleRateKey,
nil];
NSError *error = nil;
self.audioRecorder = [[AVAudioRecorder alloc]
initWithURL:self.soundFileURL
settings:self.recordSettings
error:&error];
if (error)
{
NSLog(@"error: %@", [error localizedDescription]);
} else {
[self.audioRecorder prepareToRecord];
}
[self.audioRecorder record];
[self.audioRecorder recordForDuration:(NSTimeInterval) 5];
[self.record setTitle:@"Stop" forState: UIControlStateNormal];
}
else if (self.audioRecorder.recording)
{
[self.audioRecorder stop];
[self.record setTitle:@"Record" forState: UIControlStateNormal];
}
else if (self.audioPlayer.playing) {
[self.audioPlayer stop];
}
}
答案 0 :(得分:0)
如果我正确理解你的问题,有很多方法可以解决这个问题。我有一个应用程序,它记录声音片段并存储它们以供以后播放。我将分享我的方法,你可以接受或离开它。
最初我创建一个跟你一样的记录器虽然我使用临时目录(NSTemproraryDirectory)而不是NSDocuments。我在此临时位置使用单个文件进行录制,然后在录制结束后用户确认需要保存录制内容我使用[NSMutableData dataWithContentsOfFile:]将临时文件的数据加载到内存中并将其写入我选择的路径使用[FileManager createFileAtPath:]。可能有一种更有效的方式来重现文件,但这对我的目的来说足够有效。
对于传递给createFileAtPath的路径,我使用由记录存储文件夹构建的字符串和为每个记录生成的唯一ID字符串。我使用[[NSProcessInfo processInfo] globalUniqueString]创建唯一ID,但您可以使用散列或任何其他对您有意义的技术,只要您确定它在您的记录ID集合中是唯一的。
然后,我可以为任何记录创建一个AVAudioPlayer,我只有通过构建路径来保存ID。如果没有跟踪列表或数据库中的ID,可以枚举记录目录并从其文件名构建记录ID列表。我使用数据库来存储ID以及记录时间,长度,主题等元数据。