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 に答える