3

我面临 AvAudioRecorder 的问题,在随机检查时创建损坏的文件。

它创建长度为 24kb 的文件,这并非一直发生,但随机找到的文件已损坏。

我还检查了下面的链接以获取参考,因为我有类似的问题,但它对我不起作用。

AVAudioRecorder Record 方法随机返回 NO

使用 AVAudioRecorder 看似随机的文件损坏(有时无法播放文件) - iOS

下面是完整的功能代码。

-(IBAction)btnRecordClick:(id)sender
{
    [PlayingTimer invalidate];
    PlayingTimer = nil;

    if(isPaused==NO)
    {
        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;
        }

        [audioSession setActive:YES error:&err];
        err = nil;

        if(err)
        {
            // NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
            return;
        }

        //*******Working well with .wav,.caf and .mp4 files *****************
        recordSetting = [[NSMutableDictionary alloc] init];

        //this is for .wav and .caf file
        //this is for .mp4 file for iPhone 3GS/iPhone 4
        [recordSetting setValue: [NSNumber numberWithInt:kAudioFormatMPEG4AAC] 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];

        self.strMessage = @"";
        self.strMessageType = [NSString stringWithFormat:@"Audio Message"];
        self.strFileName = [NSString stringWithFormat:@"%@.mp4", [_globalmodel stringUniqueID]];
        // NSLog(@"FileName :%@",self.strFileName);

        self.strUniqueRef = [NSString stringWithFormat:@"%@",[_globalmodel stringUniqueID]];

        NSString *soundPath;//=[NSString alloc];
        soundPath = [NSString stringWithFormat:@"%@/%@", DOCUMENTS_FOLDER,self.strFileName] ;
        NSURL *url1 = [NSURL fileURLWithPath:soundPath];

        // NSLog(@"Recording Path:%@",url1);
        err = nil;
        recorder = [[ AVAudioRecorder alloc] initWithURL:url1 settings:recordSetting error:&err];

        if(!recorder)
        {
            // NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
            UIAlertView *alert =[[UIAlertView alloc] initWithTitle: @"My Easy Media"
                                                           message: @"The Recording format is not supported on your device!"
                                                          delegate: nil
                                                 cancelButtonTitle:@"OK"
                                                 otherButtonTitles:nil];
            [alert show];
            [alert release];

            return;
        }

        //prepare to record
        [recorder setDelegate:self];
        [recorder prepareToRecord];
        recorder.meteringEnabled = YES;
        BOOL audioHWAvailable = audioSession.inputIsAvailable;

        if (! audioHWAvailable)
        {
            UIAlertView *cantRecordAlert = [[UIAlertView alloc] initWithTitle: @"Warning"
                                                                      message: @"Audio input hardware not available"
                                                                     delegate: nil
                                                            cancelButtonTitle:@"OK"
                                                            otherButtonTitles:nil];
            [cantRecordAlert show];
            [cantRecordAlert release];

            return;
        }

        // start recording
        [recorder record];
        _isRecordingStarted = YES;

        // SET TIMER // START TIMER
        timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(EndRecording:) userInfo:nil repeats:YES];

        // END TO SETTING TIMER
        timerDisplayRight.hidden = NO;
        timerDisplayLeft.hidden = NO;
        timerDisplayRight.text = [NSString stringWithFormat:@"%02d:%02d", intMimute,-- intSecond]; 
        timerDisplayLeft.text = [NSString stringWithFormat:@"00:00"];
        progressView.progress = 0.0;
    }
    else
    {
        isPaused=NO;
        [recorder record];   
        _isRecordingStarted = YES;
        [btnReview setEnabled:NO];

        timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(EndRecording:) userInfo:nil repeats:YES];
        timerDisplayRight.hidden = NO;
        timerDisplayLeft.hidden = NO;
    }

    timerDisplayRight.text = [NSString stringWithFormat:@"%02d:%02d", intMimute,-- intSecond];
}


-(IBAction)btnPauseClick:(id)sender
{
    // NSLog(@"Pause Button of ActionSheet Clicked");
    [timer invalidate];
    timer = nil;
    isPaused=YES;
    [recorder pause];

    [btnPause setEnabled:NO];
    [btnRecord setEnabled:YES];
    [btnStop setEnabled:YES];
}


-(IBAction)btnStopClick:(id)sender
{
    // NSLog(@"Stop Button of ActionSheet Clicked");
    [recorder stop];

    progressView.progress = 1.0;
    // NSLog(@"Total Recording Secomd : %d", totalRecordingSecond);
    finalRecordingSecond = totalRecordingSecond;

    [btnStop setEnabled:NO];
    [btnReview setEnabled:YES];
    [btnRecord setEnabled:YES];
    [btnPause setEnabled:NO];

    timerDisplayRight.text = [NSString stringWithFormat:@"%02d:%02d", (totalRecordingSecond/60), (totalRecordingSecond % 60) ];
    timerDisplayLeft.text = [NSString stringWithFormat:@"00:00"];

    [timer invalidate];
    timer = nil;

    // REINITIALIZE TIMER VARIABLES...
    intMimute =  5;
    intTotalTime = (60 * intMimute);   
    intSecond = intTotalTime / intMimute;
    intMimute--;       

    // REINITIALIZE TIMER VARIABLES...       
    _isRecordingStarted = NO;
}

请帮忙。一旦我开始录制并在大约 10 到 15 秒后,点击停止。

4

1 回答 1

1

我认为当任何人在单独的线程中在后台运行任何进程时会发生这种情况,同时在录制时。

于 2012-11-19T09:38:56.537 回答