将录制的音频保存在文档目录中并创建一个包含所有音频文件的数据库

Posted

技术标签:

【中文标题】将录制的音频保存在文档目录中并创建一个包含所有音频文件的数据库【英文标题】:save recorded audio in documents directory and create a database that contains all audio files 【发布时间】:2015-01-21 09:50:33 【问题描述】:

我是 ios 开发新手,在创建应用程序时遇到问题。 我的应用程序可以录制音频并保存并再次播放。 我用过 AVAudiorecorder 和 AVAudioplayer。 录制停止后,它会要求用户为要保存的文件提供名称(在文本字段中),然后应显示所有已保存文件的列表并可以在下一个屏幕上播放。 (与 italk 录音机应用程序相同) 我想将录制的文件保存在文档目录中,并想要一个包含所有音频文件元数据的数据库。数据库应该有 id、日期、标题、路径。

这就是我所做的:

if (player.playing) 
        [player stop];
    

    if (!recorder.recording) 

        [self updatefilecounter];
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setActive:YES error:nil];

        // Set the audio file
        //filename = @"nnnn";
        filename = @"Music/nnnn";
        filename = [filename stringByAppendingString:@(filecounter).stringValue];
        filename = [filename stringByAppendingString:@".m4a"];

NSArray *pathComponents = [NSArray arrayWithObjects:
                          [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject],filename,nil];

 NSURL *outputFileURL = [NSURL fileURLWithPathComponents:pathComponents];

        // Setup audio session
       [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

        // Define the recorder setting
        NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
        [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
        [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
        [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];

        // Initiate and prepare the recorder
        recorder = [[AVAudioRecorder alloc] initWithURL:outputFileURL settings:recordSetting error:NULL];
        recorder.delegate = self;
        recorder.meteringEnabled = YES;

        NSLog(@"%@", outputFileURL);

        NSLog(@"%@", filename);
        [recorder record];

     else 

        // Stop recording
        [recorder stop];
        AVAudioSession *audioSession = [AVAudioSession sharedInstance];
        [audioSession setActive:NO error:nil];

SaveAudioVC *vc = [self.storyboardinstantiateViewControllerWithIdentifier:@"SaveAudioVC"];

        [self.navigationController pushViewController:vc animated:YES];
    

文件保存为 nnnn.1、nnnn.2 等,但是当我停止应用程序并再次运行时,它会覆盖最后的文件,我希望用户提供他/她选择的名称以保存文件并在最后一个屏幕上以给定的名称显示到录制的文件。 我已经提到了这个链接:Record audio and save permanently in iOS

但是我的其他要求不匹配,所以请指导我将录制的文件保存在文档目录中,根据用户的意愿在文本字段中为文件命名,并显示所有保存的文件并如上所述创建数据库.

【问题讨论】:

【参考方案1】:

我认为你应该给出像[@"Music" stringByAppendingByPathComponents:@"nnnn"] 这样的路径字符串而不是filename = @"Music/nnnn";我希望它能给你一些想法。当我开始录音时,我给它临时名称,比如 temp.m4a 当我停止录制时,我使用以下方法将临时名称替换为新名称。

/*
 give name and replace it with defaultName'temp.m4a'
 */
- (void)convertNewName:(NSString*)newname
    NSString* folder=[documentDirectory stringByAppendingPathComponent:@"VoiceDB"];
    NSString* defaultfile=[folder stringByAppendingPathComponent:@"temp.m4a"];
    newname=[NSString stringWithFormat:@"%@.m4a",newname];
    NSString *newPath = [[defaultfile stringByDeletingLastPathComponent] stringByAppendingPathComponent:newname];
    [[NSFileManager defaultManager] moveItemAtPath:defaultfile toPath:newPath error:nil];

【讨论】:

以上是关于将录制的音频保存在文档目录中并创建一个包含所有音频文件的数据库的主要内容,如果未能解决你的问题,请参考以下文章

录制音频并保存到文档目录后无法使用 AVAudioPlayer 播放音频文件

在 UILocalNotification 声音集录制的音频

保存多个录制音频文件并获取所有录制音频

使用 SmartFace.io 录制音频(Android - Ios)

通过 openAL 将录制的音频保存为 .wav

使用音频队列 iOS api 在文件中保存最后 30 秒的音频