2012-03-14 11 views
14

현재 개발중인 앱에서 벽돌 벽에 다소 충돌했습니다. 응용 프로그램에서 로컬로 저장된 모든 오디오 파일을 표준 표보기로 나열하는보기를 입력 할 수 있습니다. 여기에서 파일을 클릭하여 재생하거나 아래의 녹음 버튼을 눌러 새 녹음을 만들면 나중에 자동으로 앱 샌드 박스에 저장됩니다.AVAudioRecorder를 사용하여 파일이 임의로 손상되었습니다 (때때로 파일을 재생할 수없는 경우도 있습니다) - iOS

이제는이 모든 것이 실제로 대부분 제대로 작동합니다. 나는 앉아서 녹음하고 다시 재생할 수 있습니다. 나는 앉아서 이것을 아무런 문제없이 45 번 정도 계속해서 시험 할 수있다. 갑자기 무작위로 나는 아주 이상한 문제에 부딪 칠 것이다. 문제는 레코더가 갑자기 레코딩을 시작한 지 상관없이 재생할 수없고 크기가 정확히 4096 바이트 인 손상된 파일 만 저장하기 시작한다는 것입니다. 이과를 중지 한 후

if (!isRecording) { 
    isRecording = YES; 
    [audioRecorder record]; 

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

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

을 그리고 :

// 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; 

내가 이런 식으로 녹음을 시작합니다

나는이처럼 설정, 완전히 표준 방식으로 AVAudioRecorder를 사용

if (isRecording) { 
    [audioRecorder stop]; 

    // Stop the timer 
    [timeCheck invalidate]; 
} 

이 문제가 발생할 수있는 원인을 알 수 없습니다. 지금까지 거의 모든 것을 시도했습니다. 난 레코더 개체가 제대로 재활용되었는지 확인했다. 그래서 당신은 각각의 레코딩에 대한 새로운 인스턴스를 가지고있다. 그리고 이전의 참조가 할당 해제되는 등등, 간섭하는 객체와 아무런 관계가없는 것을 확인한다. 그러나 아무것도 그것을 해결하지 않습니다.

손상된 파일에 어떤 문제가 발생할 수 있는지에 대해 약간의 아이디어가있는 사람이 있습니까?

+1

그래서 당신이 바로, 오류 변수가 audioRecorder가 초기화 된 후 전무 항상 말을? –

+0

네, 맞습니다 :) 실제로 NSLog가 올바르게 초기화되었는지, 그리고 NSError가 nil인지 아닌지 확인하기 위해 아래에 몇 가지 빠른 오류 검사가 있습니다. – CodingBeagle

+0

알았 으면 코드를 개선하고 문제가 분명 해지거나 사라져야합니다. isRecording var을 사용하는 대신 audioRecorder 속성 녹음을 사용할 수 있습니다. 오디오 세션 초기화를 볼 수 없지만 아마 생략했을 것입니다. 그러나 나는 또한 오류 처리를 개선하기 위해 제안하고 싶습니다, 아래의 답변을 참조로 사용할 수 있습니다 : http://stackoverflow.com/questions/1010343/how-do-i-record-audio-on-iphone-with -avaudiorecorder –

답변

6

참고 : OP는 며칠 동안 비활성 상태이므로이 질문은 대중의 향후 참조를 위해 대답해야하므로이 답변을 게시합니다.

AVAudioSession은 녹음을 시작하기 전에 얻어야합니다.

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; 
} 

참조 : https://stackoverflow.com/a/9706731/188331

+0

이것은 실제로 문제가되었습니다. 이전 질문을 확인한 이후로 잠시 지났습니다. 죄송합니다.하지만 실제로 문제의 해결책입니다. – CodingBeagle