AVAudioRecorder Record方法在随机时间返回NO

时间:2012-03-14 16:32:16

标签: iphone objective-c ios xcode avaudiorecorder

我目前正在开发一款支持应用内录音的应用。用户可以获得他/她已经通过应用程序记录的本地保存的音频文件的标准表格视图,或者按下按钮转到新的录制视图,从那里可以录制新的音频会话,这将自动获得保存到应用程序沙箱。 现在这个功能在大多数情况下运行良好。我可以录制新文件并从应用程序播放它们,但随机时间录音机将无法以此方法开始录制:

-(void) startRecording
{
if (!isRecording)
{
    isRecording = YES;

    BOOL recordingSucess = [audioRecorder record];

    if (recordingSucess)
        NSLog(@"WE STARTED THE RECORDING!");
    else
        NSLog(@"WE DID NOT START THE RECORDING!");

    // Start the timer
    recordTiming = [NSDate date];

    timeCheck = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timeCheck) userInfo:nil repeats:YES]
}

也就是说,NSLog将打印出“我们没有开始录制”,表示它无法开始录制。这导致仍然将空音频文件保存到应用程序,文件大小通常为4096字节。 这是录音机对象的初始化方式:

-(id) initWithContentURL:(NSURL *)contentURL
{
self = [super init];

if (self)
{
    NSLog(@"Initializing audio recorder!");

    // Specific settings for the audio recording
    NSDictionary *recordSettings = [NSDictionary 
                                    dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:8], 
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt: 2], 
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:22000.0], 
                                    AVSampleRateKey,
                                    nil];

    NSError *error = nil;

    audioRecorder = [[AVAudioRecorder alloc] initWithURL:contentURL settings:recordSettings error:&error];
    audioRecorder.delegate = self;
}

还有NSLog检查检查错误是否为零,所以此时我确定初始化似乎没有失败。 什么可能导致记录方法在看似随机的时间失败,而它在大多数其他时间工作得非常好?

2 个答案:

答案 0 :(得分:23)

在录制开始之前,应初始化音频会话:

AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
   NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
   return;
}
err = nil;
[audioSession setActive:YES error:&err];
if(err){
   NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
   return;
}

请参阅已接受的answer以供参考。

答案 1 :(得分:0)

contentURL总是一样,还是每次都生成一个新的?

你也可以尝试在记录之前显式调用prepareToRecord并检查它是否成功?