2012-11-23 38 views
4

我想收集到一個數組150個CMSampleBufferRef,我從我的iPhone的攝像機收到。 不知何故,相機在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]; 

這是我的StartRecording方法。

 - (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 

Tha's the buffer collection method。

+0

您是否找到答案?我有同樣的問題,謝謝! – Thomas

+0

您必須製作像素緩衝區的副本。 AVCapture重用池中的樣本緩衝區,如果他們無法解除分配它們(因爲您持有它們),它將停止產生輸出。 –

回答

2

你在嘗試什麼? AVFoundation將CMSampleBuffer傳遞給硬件編碼器。我的理論是,當它不檢測傳入的幀時,它只是停止傳遞幀。 相反,嘗試將CVPixelBufferRef存儲在CVPixelBufferPool中。

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
+0

這是不正確的。我有同樣的問題,這是將樣本追加到數組的問題。 –