xcode:如何在使用 AVFoundation 录制音频后保存音频文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9387237/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
xcode: How to save audio file after recording audio using AVFoundation
提问by iPhoneNoob
I browsed through all kinds of post related to this topic but the answers just do not really help. I used thistutorial to implement recording of audio files and playback. What seems to be missing is how to save the record permanently. When I exit my app the sound file is there but nothing is in it. I don't even know if it is saving the rocerd or just creating the file. Here is a code sample:
我浏览了与此主题相关的各种帖子,但答案并没有真正帮助。我使用本教程来实现音频文件的录制和播放。似乎缺少的是如何永久保存记录。当我退出我的应用程序时,声音文件在那里,但没有任何内容。我什至不知道它是在保存 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];
I saw a possible solution to this problem herebut since I'm new to iOS I do not really get it or it is just does not working for me.
我在这里看到了这个问题的可能解决方案,但由于我是 iOS 新手,我并没有真正理解它,或者它对我不起作用。
Please help and provide a code example. I read the documentation about AVFoundation and other classes but with no positive results.
请帮助并提供代码示例。我阅读了有关 AVFoundation 和其他类的文档,但没有任何积极的结果。
SOS :)
求救:)
UPDATEThis is my recording method:
更新这是我的录音方法:
-(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];
}
}
This is my viewDidLoad:
这是我的 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];
}
}
This is my playBack method:
这是我的播放方法:
-(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");
}
}
}
}
I hop?e this makes it clear what I do. Any suggestions where I might be wrong?
我希望?这清楚地说明了我的工作。任何我可能出错的建议?
回答by Andrew Brumbeloe
The problem is that when you tell XCode (in the viewDidLoad method) to [recorder prepareToRecord]; it gets rid of the previously recorded audio file. Eliminate that piece of code in the "if" statement and your audio file WILL be saved when you exit and come back in to the app.
问题是当你告诉 XCode(在 viewDidLoad 方法中)到 [recorder prepareToRecord]; 它摆脱了以前录制的音频文件。消除“if”语句中的那段代码,当您退出并返回应用程序时,您的音频文件将被保存。
回答by mahboudz
You need to stop recording in order to save the data to the file permanently:
您需要停止录制才能将数据永久保存到文件中:
[recorder stop];
回答by Paul Brady
FYI -- The "[recorder prepareToRecord]" method creates a fresh audio file, overwriting any previous recorded file.
仅供参考——“[recorder prepareToRecord]”方法创建一个新的音频文件,覆盖任何以前录制的文件。