[英]iOS - Recording audio with AVAudioRecorder fail with no error
I got this problem with AVAudioRecorder not working for me, at least from what i can see (or can't hear). 我遇到这个问题,AVAudioRecorder不能为我工作,至少从我能看到的(或听不到)。
I am targeting iOS 5 with ARC. 我用ARC瞄准iOS 5。
I did setup error objects but none of them get fired, so i guess i am doing something wrong here. 我确实设置了错误对象,但没有一个被解雇,所以我想我在这里做错了。
Here is the part were i setup the AVAudioRecorder : 这是我设置AVAudioRecorder的部分:
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *soundFilePath = [docsDir stringByAppendingPathComponent:currentTrack.trackFileName];
currentTrack.trackFileURL = [NSURL fileURLWithPath:soundFilePath];
NSLog(@"Chemin : %@", currentTrack.trackFileURL.path);
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
currentTrack.trackRecordSettings = recordSetting;
NSError *err = nil;
//[audioSession setDelegate:self];
if(err){
NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
[[AVAudioSession sharedInstance] setActive:YES error:&err];
err = nil;
if(err){
NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return;
}
err = nil;
recorder = [[AVAudioRecorder alloc]
initWithURL:currentTrack.trackFileURL
settings:currentTrack.trackRecordSettings
error:&error];
if (err)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning"
message: [err localizedDescription]
delegate: nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
NSLog(@"error: %@", [error localizedDescription]);
} else {
[recorder setDelegate:self];
[recorder prepareToRecord];
BOOL audioHWAvailable = [[AVAudioSession sharedInstance]inputIsAvailable ];
if (!audioHWAvailable) {
UIAlertView *cantRecordAlert =
[[UIAlertView alloc] initWithTitle: @"Warning"
message: @"Audio input hardware not available"
delegate: nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[cantRecordAlert show];
return;
}
}
No error thrown here 这里没有错误
Then when it is time to start the recording : 然后,当它开始录制时:
-(void)startRecordingAudio{
NSLog(@"Start recording");
[[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryRecord error:nil];
[recorder record];
}
Then when it is time to stop the recording : 然后,当是时候停止录制:
-(void)stopRecordingAudio{
NSLog(@"Stop recording");
[recorder stop];
NSError *err;
NSData *audioData = [NSData dataWithContentsOfFile:currentTrack.trackFileURL.path options: 0 error:&err];
if(!audioData)
NSLog(@"audio data error: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
NSLog(@"%d", audioData.length);
}
Is it normal that audioData length is always 4096 ? audioData长度总是4096是正常的吗? If i understand right it is about 93 ms of sound...
如果我理解正确的话,那是大约93毫秒的声音......
Finally, when it is time to play the recorded sound: 最后,当播放录制的声音时:
-(void)startPlayingAudio{
[[AVAudioSession sharedInstance] setCategory :AVAudioSessionCategoryPlayback error:nil];
NSLog(@"Start playing");
NSError *error;
if(player == nil){
player = [[AVAudioPlayer alloc] initWithContentsOfURL:currentTrack.trackFileURL
error:&error];
}
player.delegate = self;
if (error)
NSLog(@"Error: %@",
[error localizedDescription]);
else
[player play];
}
I did setup delegate methods that never fire too : 我确实设置了从不开火的委托方法:
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
NSLog (@"audioRecorderDidFinishRecording:successfully:");
}
-(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error
{
NSLog(@"Decode Error occurred");
}
-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully: (BOOL)flag
{
NSLog (@"audioRecorderDidFinishRecording:successfully: %d", flag);
}
-(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error
{
NSLog(@"Encode Error occurred");
}
-(void)beginInterruption{
NSLog(@"INTERRUPT");
}
Also, i did see that the .caf file are created correctly in my app document folder. 此外,我确实看到.caf文件是在我的应用程序文档文件夹中正确创建的。
Thanks for any help you can bring. 感谢您提供的任何帮助。 As for now i cannot hear the sound recorded and i test using iPhone 4 device with no headphones.
至于现在,我听不到录制的声音,我使用没有耳机的iPhone 4设备进行测试。
Found the problem : record was called before prepareRecord. 发现问题:在prepareRecord之前调用了记录。 Since i was using viewDidAppear to setup the recording, the call to start the recording was made before the view was visible...
由于我使用viewDidAppear来设置录制,因此在视图可见之前进行了开始录制的调用...
I did use viewDidAppear because viewDidLoad is not called since i dont use initWithNib. 我确实使用了viewDidAppear,因为我没有调用viewDidLoad,因为我不使用initWithNib。 I tried to override loadView, but all the examples i found are not that clear about the subject and loadView is never called.
我试图覆盖loadView,但我找到的所有示例都不清楚主题,并且从不调用loadView。 Maybe somebody can point me into the right direction?
也许有人可以指出我正确的方向? Nonetheless, i can hear my voice on the iphone!
尽管如此,我可以在iphone上听到我的声音!
Thanks for your time. 谢谢你的时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.