无法使用AVAudioRecorder永久保存音频

时间:2012-06-01 16:02:57

标签: iphone objective-c ios avaudioplayer avaudiorecorder

我正在制作的应用有多个视图,每个视图都有一个记录,停止和播放按钮。这个想法是用户可以为每个视图录制到不同的声音文件。

我可以在每个视图上录制和播放声音但是当我离开视图然后向后导航时声音消失了。

我很遗憾在下面包含如此多的代码,但这是我需要深入了解的内容。

Delegate.h

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
#import <AVFoundation/AVFoundation.h>

@interface humptyDumptyAppDelegate : UIResponder <UIApplicationDelegate>

{
    NSArray *dirPaths;
    NSString *docsDir;
    NSString *soundFilePathPage1;                               
    NSString *soundFilePathPage2;
    NSString *soundFilePathPage3;
    NSString *soundFilePathPage4;
    NSString *soundFilePathPage5;
    NSString *soundFilePathPage6;

}

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) AVAudioRecorder *audioRecorder;
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

//example getter and setter functions
- (NSArray*) getDirPaths;
- (void) setDirPaths:(NSArray*)myDirPath;
- (NSString*) getDocsDir;
- (NSString*) soundFilePathForPageNumber:(int)pageNumber;

@end

Delegate.m

#import "humptyDumptyAppDelegate.h"

@implementation humptyDumptyAppDelegate

@synthesize window = _window;
@synthesize audioPlayer;
@synthesize audioRecorder;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];

    soundFilePathPage1 = [docsDir
                          stringByAppendingPathComponent:@"audiopage1.caf"];
    soundFilePathPage2 = [docsDir
                          stringByAppendingPathComponent:@"page2.caf"];
    soundFilePathPage3 = [docsDir
                          stringByAppendingPathComponent:@"page3.caf"];
    soundFilePathPage4 = [docsDir
                          stringByAppendingPathComponent:@"page4.caf"];
    soundFilePathPage5 = [docsDir
                          stringByAppendingPathComponent:@"page5.caf"];
    soundFilePathPage6 = [docsDir
                          stringByAppendingPathComponent:@"page6.caf"];
    return YES;

}
//getter function
- (NSArray*) getDirPaths{    
    return dirPaths;
}
//setter function
- (void) setDirPaths:(NSArray*)myDirPath{
    dirPaths = myDirPath;
}
// get docs directory
-(NSString*) getDocsDir{
    return docsDir;
}
// get sound file for page, passing the page number as an argument
-(NSString*) soundFilePathForPageNumber:(int)pageNumber{
    switch (pageNumber) {
        case 1:
            return soundFilePathPage1;
            break;
        case 2:
            return soundFilePathPage2;
            break;
        case 3:
            return soundFilePathPage3;
            break;
        case 4:
            return soundFilePathPage4;
            break;
        case 5:
            return soundFilePathPage5;
            break;
        case 6:
            return soundFilePathPage6;
            break;
    }
    return nil;
}

page1.m

//this is called in viewDidLoad
-(void) prepareForAudioRecording
{
    btnPlay.enabled = NO;
    btnStop.enabled = NO;

    int page = 1;
    NSString *audioFilePath = [appDelegate soundFilePathForPageNumber:page]; 
    NSURL *soundFileURL = [NSURL fileURLWithPath:audioFilePath];
    NSError *error;
    NSDictionary *recordSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];
    appDelegate.audioRecorder = [[AVAudioRecorder alloc]
                     initWithURL:soundFileURL
                     settings:recordSettings
                     error:&error];

    if (error)
    {
        NSLog(@"error: %@", [error localizedDescription]);

    } else {
        [appDelegate.audioRecorder prepareToRecord];
    }
}

- (IBAction)recordAudio:(id)sender {
    if (!appDelegate.audioRecorder.recording)
    {
        btnPlay.enabled = NO;
        btnStop.enabled = YES;
        [appDelegate.audioRecorder record];

    }
}

- (IBAction)stopAudio:(id)sender {
    btnStop.enabled = NO;
    btnPlay.enabled = YES;
    btnRecord.enabled = YES;


    if (appDelegate.audioRecorder.recording)
    {
        [appDelegate.audioRecorder stop];
        [self audioRecorderDidFinishRecording:appDelegate.audioRecorder successfully:YES];
    } else if (appDelegate.audioPlayer.playing) {
        [appDelegate.audioPlayer stop];

    }
}

-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag
{
    if (flag == YES){
        NSLog(@"finished recording");
        [appDelegate.audioPlayer.data writeToFile:[appDelegate soundFilePathForPageNumber:1] atomically:YES];
    }
}

就像我说的,我很抱歉所包含的代码数量,但我不确定问题出在哪里。我在writeToFile方法中调用了audioRecorderDidFinishRecording:方法。我不知道这是否正确,但我觉得这不是问题的根源。

请帮助!!

2 个答案:

答案 0 :(得分:1)

此代码保存到音频文件

如何将文件合并到文档目录

BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@" sound.caf"];
    success = [fileManager fileExistsAtPath:writableDBPath];

    if (!success){
        // The writable database does not exist, so copy the default to the appropriate location.
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sound.caf"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];

        NSError *attributesError;
        NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:writableDBPath error:&attributesError];

        NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
        long long fileSize = [fileSizeNumber longLongValue];
        NSLog(@"file size: %lld",fileSize);

        if (!success) {
            NSLog(@"Failed to create writable database file with message: %@", [error localizedDescription]);
        }

    }

答案 1 :(得分:0)

事实证明问题是,在我的某个网页中,prepareForAudioRecording中的viewDidAppear自动覆盖了已保存的音频。将其移至viewDidLoad可以解决问题