밤의 야간 효과 비디오를 녹화 할 수있는 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
어떤 도움 주셔서 감사합니다.
좀비 감지 기능을 켜고 앱을 실행 했습니까? 할당 해제 된 객체에 대한 호출처럼 들립니다. '[audio_output setSampleBufferDelegate : special_delegate queue : queue];'special_delegate를 유지합니까? 이 호출 전후에 중단 점을 추가하고 'p (int) [special_delegate retaincount]'와 같은 것을 시도하십시오. 디버거에서. – emp
네 말이 맞다! 고맙습니다. 웬일인지 그것을 유지하지 않는다. 나는 그렇게 생각했다. –
나는 똑같은 문제에 직면 해있다. 이 문제를 어떻게 해결 했습니까? 나는 당신이 대의원을 유지하는 데 필요한 언급을 읽었습니다. 하지만 내 응용 프로그램은 ARC를 사용하고 있습니다. 어떻게 해결할 수 있습니까? 감사합니다 – Nitin