【问题标题】:AVAudioRecorder Record method returns NO at random timesAVAudioRecorder Record 方法随机返回 NO
【发布时间】:2012-03-31 03:38:30
【问题描述】:

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

-(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会打印出“We did not start the recording”,表示启动录制失败。这导致一个空的音频文件仍然保存到应用程序中,文件大小为 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 检查,检查错误是否为 nil,所以在这一点上我确定初始化似乎没有失败。 究竟是什么导致记录方法在看似随机的时间失败,而在大多数其他时间却运行良好?

【问题讨论】:

    标签: iphone objective-c ios xcode avaudiorecorder


    【解决方案1】:

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

    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 以供参考。

    【讨论】:

    • 我会试试这个然后回来。只需要测试足够长的时间以确保错误消失
    • @Luffen 很高兴它有帮助。至于4096,我想这是一个媒体文件的头部分,已经写入磁盘作为准备,但是录制失败并且文件的数据部分没有填充。
    • 我在停止录制后随机获得了 28 个字节。在录制之前添加此音频会话后就可以了。
    【解决方案2】:

    contentURL 总是相同还是每次都生成一个新的?

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

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2021-04-07
      • 2016-10-29
      • 1970-01-01
      • 2019-02-20
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      相关资源
      最近更新 更多