xcode:如何使用AVFoundation录制audio后保存audio文件

我浏览了与这个主题相关的各种post,但答案并没有真正的帮助。 我使用本教程来实现录制audio文件和播放。 似乎缺less的是如何永久保存logging。 当我退出我的应用程序的声音文件是在那里,但没有任何内容。 我甚至不知道它是保存rocerd还是只创build文件。 这是一个代码示例:

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]; 

我在这里看到了这个问题的一个可能的解决scheme,但是因为我是iOS新手,所以我没有真正理解它,或者只是不适合我。

请帮助并提供一个代码示例。 我读了关于AVFoundation和其他类的文档,但没有任何积极的结果。

SOS 🙂

更新这是我的录音方法:

 -(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]; } } 

这是我的playBack方法:

 -(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"); } } 

}

我跳了一遍,这说明了我的工作。 任何build议,我可能是错的?

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

 [recorder stop]; 

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

仅供参考 – “[logging器prepareToRecord]”方法创build一个新的audio文件,覆盖任何以前logging的文件。