2012-11-23 3 views
4

나는 나의 iPhone의 비디오 카메라로부터받은 150 CMSampleBufferRef 배열을 수집하려고한다. 어떻게 든 카메라는 13 개의 버퍼 이후에 델리게이트를 호출하는 것을 멈 춥니 다. NSMutableArray, CFArray 작업을 시도했다. 아무것도 도움이되지 않았다. 메모리가 있다고 의심하지만 메모리 경고에 대해서는 아무 것도 없습니다.CMSampleBufferRef를 CFArray 버퍼링하기

나는 그것에 대한 도움을 드리겠습니다.
미리 감사드립니다.

  session = [[AVCaptureSession alloc]init]; 
      //Quality Preset 
      if ([session canSetSessionPreset:AVCaptureSessionPresetLow]) { 
       session.sessionPreset = AVCaptureSessionPresetLow; 
      } 


      [session beginConfiguration]; 
      AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
      AVCaptureDeviceInput *newVideoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil]; 

      AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; 

      output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) }; 
      dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL); 
      [output setSampleBufferDelegate:self queue:queue]; 

      [session addOutput:output]; 
      [session addInput:newVideoDeviceInput]; 
      AVCaptureConnection *conn = [output connectionWithMediaType:AVMediaTypeVideo]; 



      if (conn.supportsVideoMinFrameDuration) 
       conn.videoMinFrameDuration = CMTimeMake(1, 10); 
      if (conn.supportsVideoMaxFrameDuration) 
       conn.videoMaxFrameDuration = CMTimeMake(1, 10); 


      [session commitConfiguration]; 

      arr = CFArrayCreateMutable(NULL, 150, &kCFTypeArrayCallBacks); 
      counter=0; 
      [session startRunning]; 

그건 내 시작 녹음 방법이었습니다.

 - (void)captureOutput:(AVCaptureOutput *)captureOutput 
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection { 
      if (counter==150) { 
     [self StopRecording:nil]; 
     return; 
    } 
      CFArrayInsertValueAtIndex(arr, counter, sampleBuffer); 

      counter= (counter+1)%150; 

     } 
     @end 

여기에는 버퍼 수집 방법이 사용됩니다.

+0

답변을 찾았습니까? 나는 같은 문제가있어, 고마워! – Thomas

+0

픽셀 버퍼의 복사본을 만들어야합니다. AVCapture는 풀에있는 샘플 버퍼를 재사용하고, 버퍼를 풀어 내기가 어려울 경우 (결과를 잡기 때문에) 출력을 생성하지 않게됩니다. –

답변

2

수행 할 작업은 무엇입니까? AVFoundation은 CMSampleBuffer를 하드웨어 인코더로 전달합니다. 내 이론은 들어오는 프레임을 감지하지 못할 때 프레임을 전달하는 것을 중지합니다. 대신 CVPixelBufferPool에 CVPixelBufferRef를 저장해보십시오.

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
+0

그건 맞지 않아. 나는 같은 문제가 있으며 배열에 샘플을 추가하는 것과 관련이있다. –