0

我正在开发的程序需要我保存大量的 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];
    }
}
4

1 回答 1

0

如果我正确理解你的问题,有很多方法可以解决这个问题。我有一个应用程序可以记录声音片段并存储它们以供以后播放。我会分享我的方法,你可以接受或离开。

最初我创建了一个记录器,就像你做的一样,虽然我使用临时目录 (NSTemproraryDirectory) 而不是 NSDocuments。我在此临时位置使用单个文件进行记录,然后在记录完成并且用户确认希望保存记录后,我使用 [NSMutableData dataWithContentsOfFile:] 将临时文件的数据加载到内存中并将其写入我选择的路径使用 [FileManager createFileAtPath:]。可能有一种更有效的方法来重现文件,但这对于我的目的来说已经足够有效了。

对于传递给 createFileAtPath 的路径,我使用由我的录音存储文件夹构建的字符串和为每个录音生成的 uniqueID 字符串。我使用 [[NSProcessInfo processInfo] globalUniqueString] 创建唯一 ID,但您可以使用散列或任何其他对您有意义的技术,只要您确定它在您的记录 ID 集中是唯一的。

然后,我可以为任何我有 ID 的录音创建一个 AVAudioPlayer,只需像我保存它时那样构建路径。如果没有跟踪列表或数据库中的 ID,则可以枚举记录目录并根据文件名构建记录 ID 列表。我使用数据库来存储 ID 以及记录时间、长度、主题等元数据。

于 2012-09-11T00:53:26.790 回答