xcode:如何在使用 AVFoundation 录制音频后保存音频文件

Posted

技术标签:

【中文标题】xcode:如何在使用 AVFoundation 录制音频后保存音频文件【英文标题】:xcode: How to save audio file after recording audio using AVFoundation 【发布时间】:2012-02-22 00:00:54 【问题描述】:

我浏览了与该主题相关的各种帖子,但答案并没有真正的帮助。我使用this教程实现了音频文件的录制和播放。似乎缺少的是如何永久保存记录。当我退出我的应用程序时,声音文件在那里,但里面什么都没有。我什至不知道它是在保存 rocerd 还是只是创建文件。 这是一个代码示例:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"tmpSound.caf"];

tempRecFile = [NSURL fileURLWithPath:soundFilePath];

NSDictionary *recSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];

recorder = [[AVAudioRecorder alloc] initWithURL:tempRecFile settings:recSettings error:nil];
[recorder setDelegate:self];
[recorder prepareToRecord];
[recorder record];

我看到了这个问题的可能解决方案here,但由于我是 ios 新手,我并没有真正理解它,或者它对我不起作用。

请提供帮助并提供代码示例。我阅读了有关 AVFoundation 和其他类的文档,但没有得到积极的结果。

求救 :)

更新 这是我的录音方法:

-(IBAction)recording
    //***** METHOD for recording

    if(isNotRecording)
        isNotRecording = NO;
        [recButton setTitle:@"Stop"  forState:UIControlStateNormal];
        recStateLabel.text = @"Recording";

        [recorder setDelegate:self];
        [recorder prepareToRecord];
        [recorder record];

    
    else
        isNotRecording = YES;
        [recButton setTitle:@"Rec Begin" forState:UIControlStateNormal];
        playButton.hidden = NO;
        recStateLabel.text = @"Not recording";
        [recorder stop];
    



这是我的 viewDidLoad:

- (void)viewDidLoad

    //record sound test code - start
    isNotRecording = YES;
    //playButton.hidden = YES;
    recStateLabel.text = @"Not recording";

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];

    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

    [audioSession setActive:YES error:nil];
    //record sound test code -  END

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    // code for generating the sound file that is to be saved
    NSArray *dirPaths;
    NSString *docsDir;

    dirPaths = NSSearchPathForDirectoriesInDomains(
                                                   NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];
    NSString *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"sound.caf"];

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSDictionary *recordSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0], 
                                    AVSampleRateKey,
                                    nil];

    NSError *error = nil;

    recorder = [[AVAudioRecorder alloc]
                     initWithURL:soundFileURL
                     settings:recordSettings
                     error:&error];

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

     else 
        [recorder prepareToRecord];
    


这是我的播放方法:

-(IBAction)playback
    //AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil];
    NSError *error;
    // setting the uri of the formed created file
    NSArray *dirPaths;
    NSString *docsDir;



dirPaths = NSSearchPathForDirectoriesInDomains(
                                               NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir
                           stringByAppendingPathComponent:@"sound.caf"];

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:soundFileURL error:&error];



[player setNumberOfLoops:0];
[player prepareToPlay];
[player setVolume:1];
[player play];
NSLog(@"URL je: %@", soundFileURL);


//method 2
if (error)
    NSLog(@"Error: %@", 
          [error localizedDescription]);
else


    [player play];
    if(player.isPlaying==YES)
    
        NSLog(@"It's playing");
    

我希望这清楚地表明了我的工作。 有什么我可能错的建议吗?

【问题讨论】:

【参考方案1】:

您需要停止记录才能将数据永久保存到文件中:

[recorder stop];

【讨论】:

您好@mahboudz,我使用 [recorder stop] 停止录制。我不认为这是问题所在。停止录制后,我可以使用 AVplayer 播放“录制的”声音,其 url 与录音机相同。问题是我重新启动我的应用程序后没有播放声音。 Taht 意味着它不会永久保存,而仅在会话/实例期间保存。 你是说停止录制后文件长度为零? 你实现了委托方法:- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error吗?这可以告诉您加密时是否有错误。你什么时候打电话给-stop?是在将应用程序放入后台时吗?还是之前? 我刚刚更新了我的问题并填写了我的代码,这样你就可以看到我得到的一切。应用程序重新启动后按下播放按钮时没有错误只是没有声音。然后我录制一些东西,然后按下播放按钮,声音就在那里。 这是一个示例:***.com/questions/1010343/…【参考方案2】:

问题是当你告诉 XCode(在 viewDidLoad 方法中)到 [recorder prepareToRecord];它摆脱了以前录制的音频文件。消除“if”语句中的那段代码,当您退出并返回应用程序时,您的音频文件将被保存。

【讨论】:

【参考方案3】:

仅供参考——“[recorder prepareToRecord]”方法创建一个新的音频文件,覆盖任何以前录制的文件。

【讨论】:

以上是关于xcode:如何在使用 AVFoundation 录制音频后保存音频文件的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 和 XCode 6 上的 AVFoundation 语音合成

Xcode 5.1.1 归档时无法构建模块“AVFoundation”

AVFoundation -AVCaptureSession 仅在进入后台并返回断点时停止并开始运行

IOS8:AVFoundation 相机冻结

Xcode中重复声音的问题

AVFoundation 快速播放声音 2