AVAudioRecorder不会录制以前录制的IF电影&发挥 [英] AVAudioRecorder won't record IF movie was previously recorded & played
问题描述
我的iPhone应用程序使用AVAudioRecorder进行录音。它还使用UIImagePickerController来录制电影,使用MPMoviePlayerController来播放电影。
My iPhone app uses "AVAudioRecorder" to make voice recordings. It also uses "UIImagePickerController" to record movies and "MPMoviePlayerController" to play movies.
一切正常,直到我连续做三件事:
Everything works fine until I do all three things in a row:
- 使用UIImagePickerController录制电影
- 使用MPMoviePlayerController播放录制的电影
- 尝试使用AVAudioRecorder进行录音
当我在步骤3中调用AVAudioRecorder的记录方法时,它返回NO表示失败,但没有提示原因(来自Apple!)AVAudioRecorder的audioRecorderEncodeErrorDidOccur委托方法从来没有被调用过,设置录音机时我没有收到任何其他错误。
When I call AVAudioRecorder's "record" method in step 3, it returns NO indicating failure, but giving no hints as to why (come on Apple!) AVAudioRecorder's audioRecorderEncodeErrorDidOccur delegate method is never called and I receive no other errors when setting up the recorder.
我的第一个猜测是电影录制/播放正在修改AVAudioSession的共享实例这样一种方式可以防止录音机工作。但是,我手动将AVAudioSession的类别属性设置为AVAudioSessionCategoryRecord,并且在尝试记录之前使音频会话处于活动状态。
My first guess was that the movie recording/playing was modifying the shared instance of "AVAudioSession" in such a way that it prevented the audio recorder from working. However, I'm manually setting AVAudioSession's category property to "AVAudioSessionCategoryRecord" and I make the audio session active before trying to record.
这是我创建记录器的方法:
Here's my method for creating the recorder:
- (void)createAudioRecorder
{
NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord error:&error];
if (error)
...
[audioSession setActive:YES error:&error];
if (error)
...
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
// General Audio Format Settings
[settings setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey];
[settings setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[settings setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
// Encoder Settings
[settings setValue:[NSNumber numberWithInt:AVAudioQualityMin] forKey:AVEncoderAudioQualityKey];
[settings setValue:[NSNumber numberWithInt:96] forKey:AVEncoderBitRateKey];
[settings setValue:[NSNumber numberWithInt:16] forKey:AVEncoderBitDepthHintKey];
// Write the audio to a temporary file
NSURL *tempURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"Recording.m4a"]];
audioRecorder = [[AVAudioRecorder alloc] initWithURL:tempURL settings:settings error:&error];
if (error)
...
audioRecorder.delegate = self;
if ([audioRecorder prepareToRecord] == NO)
NSLog(@"Recorder fails to prepare!");
[settings release];
}
这是我开始录制的方法:
And here's my method to start recording:
- (void)startRecording
{
if (!audioRecorder)
[self createAudioRecorder];
NSError *error = nil;
[[AVAudioSession sharedInstance] setActive:YES error:&error];
if (error)
...
BOOL recording = [audioRecorder record];
if (!recording)
NSLog(@"Recording won't start!");
}
之前是否有人遇到此问题?
Has anyone run into this problem before?
推荐答案
我遇到了同样的问题。在我解决问题之前,我的录制/播放代码是这样的:
I was having the same issue. Before I fixed the issue, my recording/playback code was like this:
开始录制功能
- (BOOL) startRecording {
@try {
NSDictionary *recordSetting = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, [NSNumber numberWithFloat: 44100.0], AVSampleRateKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey, nil];
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *soundFilePath = [documentsPath stringByAppendingPathComponent:@"recording.caf"];
if(audioRecorder != nil) {
[audioRecorder stop];
[audioRecorder release];
audioRecorder = nil;
}
NSError *err = nil;
audioRecorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSetting error:&err];
[soundFileURL release];
[recordSetting release];
if(!audioRecorder || err){
NSLog(@"recorder initWithURL: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return NO;
}
[audioRecorder peakPowerForChannel:8];
[audioRecorder updateMeters];
audioRecorder.meteringEnabled = YES;
[audioRecorder record];
}
@catch (NSException * e) {
return NO;
}
recording = YES;
return YES;
}
停止录制功能
- (BOOL) stopRecording {
@try {
[audioRecorder stop];
[audioRecorder release];
audioRecorder = nil;
recording = NO;
}
@catch (NSException * e) {
return NO;
}
return YES;
}
开始播放功能
- (BOOL) startPlaying {
@try {
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *soundFilePath = [documentsPath stringByAppendingPathComponent:@"recording.caf"]; NSURL * soundFileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
NSError *err = nil;
if (audioPlayer) {
[audioPlayer release];
audioPlayer = nil;
}
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error: &err];
[soundFileURL release];
if (!audioPlayer || err) {
NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
return NO;
}
[audioPlayer prepareToPlay];
[audioPlayer setDelegate: self];
[audioPlayer play];
playing = YES;
}
@catch (NSException * e) {
return NO;
}
return YES;
}
停止播放功能
- (BOOL) stopPlaying {
@try {
[audioPlayer stop];
[audioPlayer release];
audioPlayer = nil;
playing = NO;
}
@catch (NSException * e) {
return NO;
}
return YES;
}
我在播放捕获的视频后解决了录制问题,代码如下:
- (BOOL) startRecording {
@try {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
// rest of the recording code is the same .
}
- (BOOL) stopRecording {
@try {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
// rest of the code is the same
}
- (BOOL) startPlaying {
@try {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
// rest of the code is the same.
}
- (BOOL) stopPlaying {
// There is no change in this function
}
这篇关于AVAudioRecorder不会录制以前录制的IF电影&发挥的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!