2011-03-04 2 views
3

밤의 야간 효과 비디오를 녹화 할 수있는 Night Cam이라는 멋진 작은 앱을 만들었습니다. 나는 지금 그것을 업데이트하는 과정에있다.오디오와 비디오를 결합한 AVCaptureSession - 오디오 부분이 EXC_BAD_ACCESS를 제공합니다.

비디오 캡처는 훌륭하게 작동하지만 오디오는 그렇지 않습니다. 파일에 레코딩이 일어나지 않을 때 응용 프로그램을 켜면 문제가 발생합니다 (나중에 레코딩 할 때만 오디오를 활성화하도록 변경합니다).

session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetMedium; 
camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
AVCaptureDeviceInput * camera_input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:nil]; 
[session addInput:camera_input]; 
AVCaptureDeviceInput * microphone_input = [AVCaptureDeviceInput deviceInputWithDevice:microphone error:nil]; 
[session addInput:microphone_input]; 
AVCaptureVideoDataOutput * output = [[AVCaptureVideoDataOutput alloc] init]; 
output.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]; 
[session addOutput:output]; 
output.minFrameDuration = CMTimeMake(1,30); 
dispatch_queue_t queue = dispatch_queue_create("MY QUEUE", NULL); 
[output setSampleBufferDelegate:self queue:queue]; 
dispatch_release(queue); 
AVCaptureAudioDataOutput * audio_output = [[AVCaptureAudioDataOutput alloc] init]; 
[session addOutput:audio_output]; 
queue = dispatch_queue_create("MY QUEUE", NULL); 
AudioOutputBufferDelegate * special_delegate = [[[AudioOutputBufferDelegate alloc] init] autorelease]; 
special_delegate->normal_delegate = self; 
[audio_output setSampleBufferDelegate:special_delegate queue:queue]; 
dispatch_release(queue); 

은 "특별 대표는"이것이다 :

다음은 관련 코드입니다 기록 부울이 너무 아무것도 추가하지 설정되지 않은

@implementation AudioOutputBufferDelegate 
    -(void)captureOutput: (AVCaptureOutput *) captureOutput didOutputSampleBuffer: (CMSampleBufferRef) sampleBuffer fromConnection: (AVCaptureConnection *) conenction{ 
     if (normal_delegate->recording) { 
      [normal_delegate->audio_writer_input appendSampleBuffer: sampleBuffer]; 
     } 
    } 
@end 

. 앱이 충돌 할 때 AVAssestWriter가 설정되지 않기 때문에 AVAssestWriter의 설정에 대해 걱정할 필요가 없습니다. 오디오 입력을 설정해야합니다. 이 충돌 할 때 여기에

호출 스택입니다 :
> #0 0x33479464 in objc_msgSend 
> #1 0x348154b2 in -[AVCaptureAudioDataOutput _AVCaptureAudioDataOutput_AudioDataBecameReady] 
> #2 0x34815690 in AVCaptureAudioDataOutput_AudioDataBecameReady 
> #3 0x33cc5984 in FigRecorderRemoteCallbacksServer_SampleBuffersArePending 
> #4 0x33cc2adc in _XSampleBuffersArePending 
> #5 0x33ca42ba in figrecordercallbacks_server 
> #6 0x33ca3238 in remrec_ClientPortCallBack 
> #7 0x33a5dbe6 in __CFMachPortPerform 
> #8 0x33a556fe in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ 
> #9 0x33a556c2 in __CFRunLoopDoSource1 
> #10 0x33a47f7c in __CFRunLoopRun 
> #11 0x33a47c86 in CFRunLoopRunSpecific 
> #12 0x33a47b8e in CFRunLoopRunInMode 
> #13 0x33b0e4aa in GSEventRunModal 
> #14 0x33b0e556 in GSEventRun 
> #15 0x32099328 in -[UIApplication _run] 
> #16 0x32096e92 in UIApplicationMain 
> #17 0x000023e0 in main at main.m:14 

어떤 도움 주셔서 감사합니다.

+1

좀비 감지 기능을 켜고 앱을 실행 했습니까? 할당 해제 된 객체에 대한 호출처럼 들립니다. '[audio_output setSampleBufferDelegate : special_delegate queue : queue];'special_delegate를 유지합니까? 이 호출 전후에 중단 점을 추가하고 'p (int) [special_delegate retaincount]'와 같은 것을 시도하십시오. 디버거에서. – emp

+0

네 말이 맞다! 고맙습니다. 웬일인지 그것을 유지하지 않는다. 나는 그렇게 생각했다. –

+0

나는 똑같은 문제에 직면 해있다. 이 문제를 어떻게 해결 했습니까? 나는 당신이 대의원을 유지하는 데 필요한 언급을 읽었습니다. 하지만 내 응용 프로그램은 ARC를 사용하고 있습니다. 어떻게 해결할 수 있습니까? 감사합니다 – Nitin

답변

2

프로그램이 일종의 잘못된 메모리에 액세스하는 것 같습니다. 설정에서 NSZombieEnabled 속성을 활성화하려고 했습니까? 지난 주와 같은 EXC_BAD_ACCESS 문제를 발견했습니다. 그렇게 할 때 충돌을 일으키는 호출이 중단되어야합니다.

1

준비가되지 않았거나 생성되지 않은 항목에 액세스하려는 것 같습니다.

+0

좋아, 고마워. 내가 놓친 어떤 생각? –

1

special_delegate 객체를 보유해야했습니다.

관련 문제