如何在iPhone录制后保存音频文件?

时间:2011-08-01 15:52:30

标签: objective-c audio-recording

嗨我有代码记录,但我无法弄清楚如何保存,当我再次回来时,我可以再次播放相同的录音文件?

我正在使用以下代码进行录制 -

-----
-(IBAction) startRecording
{
    NSLog(@"startRecording");
    [audioRecorder release];
    audioRecorder = nil;

    // Init audio with record capability
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryRecord error:nil];

    NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc]                 initWithCapacity:10];
    if(recordEncoding == ENC_PCM)
    {
        [recordSettings setObject:[NSNumber numberWithInt: kAudioFormatLinearPCM] forKey: AVFormatIDKey];
        [recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey];
    [recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
    [recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
    [recordSettings setObject:[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];   
    } else {
    NSNumber *formatObject;

    switch (recordEncoding) {
    case (ENC_AAC): 
        formatObject = [NSNumber numberWithInt: kAudioFormatMPEG4AAC];
        break;
    case (ENC_ALAC):
        formatObject = [NSNumber numberWithInt: kAudioFormatAppleLossless];
        break;
    case (ENC_IMA4):
        formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4];
        break;
    case (ENC_ILBC):
        formatObject = [NSNumber numberWithInt: kAudioFormatiLBC];
        break;
    case (ENC_ULAW):
        formatObject = [NSNumber numberWithInt: kAudioFormatULaw];
        break;
    default:
        formatObject = [NSNumber numberWithInt: kAudioFormatAppleIMA4];
}

[recordSettings setObject:formatObject forKey: AVFormatIDKey];
[recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey: AVSampleRateKey];
[recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey];
[recordSettings setObject:[NSNumber numberWithInt:12800] forKey:AVEncoderBitRateKey];
[recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSettings setObject:[NSNumber numberWithInt: AVAudioQualityHigh] forKey: AVEncoderAudioQualityKey];
}

NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf", [[NSBundle mainBundle] resourcePath]]];


NSError *error = nil;
audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];

if ([audioRecorder prepareToRecord] == YES){
    [audioRecorder record];
} else {
    int errorCode = CFSwapInt32HostToBig ([error code]); 
    NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&errorCode); 

}
NSLog(@"recording");
}
----

请让我知道如何保存此音频文件?所以我可以再次重新打开应用程序并播放录制的文件。

由于

3 个答案:

答案 0 :(得分:1)

将有效路径附加到要保存的文件的名称。例如,获取应用程序文档目录的可写路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *recordDir = [paths objectAtIndex:0];

将此recordDir附加到文件名:

NSString *recordFile = [recordDir stringByAppendingPathComponent: @"recordTest.caf"];

使用此完整路径获取以下网址:

NSURL *url = [NSURL fileURLWithPath:recordFile];

现在使用此网址创建AVAudioRecorder

答案 1 :(得分:1)

在ViewController.m中清理了viewLoad:      - (void)viewDidLoad {

 AVAudioSession *audioSession = [AVAudioSession sharedInstance];

 [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

 [audioSession setActive:YES error:nil];

 [recorder setDelegate:self];

 [super viewDidLoad];
}

ViewController.m中的已编辑记录:

- (IBAction) record
{

NSError *error;

// Recording settings
NSMutableDictionary *settings = [NSMutableDictionary dictionary];

[settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[settings setValue: [NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
[settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
[settings setValue:  [NSNumber numberWithInt: AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];

NSArray *searchPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath_ = [searchPaths objectAtIndex: 0];

NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]];

// File URL
NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH];


//Save recording path to preferences
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


[prefs setURL:url forKey:@"Test1"];
[prefs synchronize];


// Create recorder
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

[recorder prepareToRecord];

[recorder record];
}

在ViewController.m中编辑播放:

-(IBAction)playBack
 {

 AVAudioSession *audioSession = [AVAudioSession sharedInstance];

 [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

 [audioSession setActive:YES error:nil];


 //Load recording path from preferences
 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


 temporaryRecFile = [prefs URLForKey:@"Test1"];



  player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];



  player.delegate = self;


  [player setNumberOfLoops:0];
   player.volume = 1;


 [player prepareToPlay];

 [player play];


}

并向ViewController.m添加了一个新的dateString方法:

- (NSString *) dateString
{
// return a formatted string for a file name
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"ddMMMYY_hhmmssa";
return [[formatter stringFromDate:[NSDate date]] stringByAppendingString:@".aif"];
}

现在它可以通过NSUserdefaults加载最后记录的文件:

//Load recording path from preferences
  NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


  temporaryRecFile = [prefs URLForKey:@"Test1"];



  player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];

在(IBAction)playBack中。 temporaryRecFile是我的ViewController类中的NSURL变量。

声明如下ViewController.h:

 @interface SoundRecViewController : UIViewController <AVAudioSessionDelegate,AVAudioRecorderDelegate, AVAudioPlayerDelegate>
{
 ......
 ......
NSURL *temporaryRecFile;

AVAudioRecorder *recorder;
AVAudioPlayer *player;

 }
 ......
 ......
  @end

答案 2 :(得分:0)

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

NSArray *documentsFolders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[documentsFolders objectAtIndex:0] stringByAppendingPathComponent:@"Recording.aiff"];

[library writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:path] completionBlock:^(NSURL *assetURL, NSError *error){

    /*notify of completion*/

    NSLog(@"AssetURL: %@",assetURL);
    NSLog(@"Error: %@",error);

    if (!error) {
        //video saved

        [[self appDelegate] showAlertWithTitle:@"Audio Saved" message:@""];

    }
    else{

        [[self appDelegate] showAlertWithTitle:@"Error" message:error.domain];

    }

}];